【问题标题】:String n = new String( char + int) adds but should concatenateString n = new String(char + int) 添加但应该连接
【发布时间】:2018-01-28 22:02:17
【问题描述】:

我有一个类的以下代码:

public class sqrt
{
    public sqrt()
    {
        char    start   = 'H';
        int     second  = 3110;
        char    third   = 'w';
        byte    fourth  = 0;
        char    fifth   = 'r';
        int     sixth   = 1;
        char    seventh = 'd';
        float   eighth  = 2.0f;
        boolean ninth  = true;

        String output = new String(start + second + " " + third + fourth +
        fifth + sixth + seventh + " " + eighth + " " + ninth);
        System.out.println(output);
    }  
}

需要的输出是:

H3110 w0r1d 2.0 true

但是,这会输出以下内容:

3182 w0r1d 2.0 true

我只能假设这是因为它看到了 char 'H' 的数字 (ASCII) 值并将其添加到 int 3110

我的问题是:

不应该new String() 将其中的每个项目转换为字符串并将它们连接起来吗?

如果我将输出更改为:

String output = start + second + " " + third + fourth +
                fifth + sixth + seventh + " " + eighth +
                " " + ninth;

它做同样的事情,并将 charint 的值加在一起,然后再连接其余部分。

我知道我可以通过在start 之前添加"" + 来克服这个问题,我想这解释了为什么它看到char 'H' 的ASCII 值(因为它查看下一个值,看到它是一个整数,并从那里开始?),但我很困惑为什么 new String() 没有按预期工作。

PS,我想写出更好的问题,而且我知道我在这里仍然是一个初学者,所以在这方面的任何建议也将不胜感激。如果有人愿意花时间提供帮助,我们非常欢迎 PM。

PPS,如果我弄清楚这是为什么,我会自己发布答案,但我真的很想学习这个,我只是很困惑。

【问题讨论】:

  • 一般来说,你不应该在 Java 中使用new String()。对于字符串连接,使用+StringBuilder
  • 没有new String(); 也一样,我将编辑问题以显示这一点。我很抱歉。
  • new String(String) 只是为您提供具有给定内容的唯一字符串,它不应该改变与您的问题有关的任何内容
  • 我想你要找的答案在这里stackoverflow.com/questions/8688668/…
  • @ZLHysong,正如您所推测的,基本上问题出在 + 运算符的语义上:在 charint 操作数之间,它意味着 addition 而不是 字符串连接。如果您将所有+s 替换为StringBuilder.append(...),则没有歧义,并且可以正常工作。

标签: java string concatenation


【解决方案1】:

我只能假设这是因为它看到了 char 'H' 的数字 (ASCII) 值并将其添加到 int 3110

完全正确。

不应该new String() 将其中的每个项目转换为字符串并将它们连接起来吗?

String 构造函数无法对此进行控制,因为表达式 start + second + " " + ... 之前已计算过。


这里的简洁方法是使用StringBuilder。它具有接受所有原始类型和任意对象的方法。

String output = new StringBuilder().append(start).append(second).append(' ')
    .append(third).append(fourth).append(fifth).append(sixth).appends(seventh)
    .append(' ').append(eighth).append(' ').append(ninth).toString();

StringBuilder builder = new StringBuilder();
builder.append(first);
builder.append(second);
builder.append(' ');
builder.append(third);
builder.append(fourth);
builder.append(firth);
builder.append(sixth);
builder.append(seventh);
builder.append(' ');
builder.append(eighth);
builder.append(ninth);
String output = builder.toString();

【讨论】:

  • 谢谢。这对我来说最有意义,而所有答案都很有帮助。我已将其标记为我的问题的解决方案。
【解决方案2】:

不应该 new String() 将其中的每个项目转换为字符串并将它们连接起来吗?

new String() 与它无关。首先我们评估表达式。然后我们将表达式的值传递给 String 构造函数。

所以首先我们将一个 char 添加到一个 int;这是整数加法。然后将 (3112) 的结果转换为字符串,以便可以将其连接到字符串“”。此后至少有一个操作数是字符串,因此适用连接。

【讨论】:

    【解决方案3】:

    我很困惑为什么 new String() 没有按预期工作。

    它按预期工作,即初始化一个新的 String 对象,表示传递给它的数据。

    不应该 new String() 将其中的每个项目都转换为字符串并且 连接它们?

    目前,您使用的是this overload of the String constructor,其中指出:

    初始化一个新创建的 String 对象,使其代表 与参数相同的字符序列;换句话说,新 创建的字符串是参数字符串的副本。

    本质上,由于您传递给String 构造函数的字符串是3182 w0r1d 2.0 true,因此新的字符串对象就是它的副本。没有执行任何其他操作。

    【讨论】:

      【解决方案4】:

      您可以使用下面的代码,因为字符本身不能更改为字符串 所以:

      String output = new String(String.valueOf(start) + second + " " + third + fourth +
        fifth + sixth + seventh + " " + eighth + " " + ninth);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-14
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 2012-06-09
        相关资源
        最近更新 更多