String n = new String(char + int)add,但是应该连接

时间:2018-01-28 22:02:18

标签: java string concatenation

我有一个类的以下代码:

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值(因为它会查看下一个值) ,看到它是一个int,并从那里开始?),但我很困惑为什么new String()没有按预期工作。

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

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

4 个答案:

答案 0 :(得分:5)

  

我只能假设这是因为它看到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();

答案 1 :(得分:2)

  

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

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

首先,我们要为一个int添加一个char;这是整数加法。然后将结果(3112)转换为字符串,以便它可以连接到字符串" &#34 ;.此后,至少有一个操作数是一个字符串,因此应用了连接。

答案 2 :(得分:1)

  

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

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

  

新的String()不应该将每个项目转换为字符串和   连接它们?

目前,您正在使用this overload of the String constructor声明:

  

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

基本上,因为传递给String构造函数的字符串是3182 w0r1d 2.0 true,新的字符串对象就是它的副本。没有其他任何事情可以执行。

答案 3 :(得分:1)

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

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