我有一个类的以下代码:
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;
它做同样的事情,并在连接其余部分之前将char
和int
的值加在一起。
我知道我可以通过在"" +
之前添加start
来解决这个问题,我想这可以解释为什么它会看到char 'H'
的ASCII值(因为它会查看下一个值) ,看到它是一个int,并从那里开始?),但我很困惑为什么new String()
没有按预期工作。
PPS,如果我弄清楚为什么会这样,我会自己发布答案,但我真的想学习这个,而且我很困惑。
答案 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);