字符串和字符的连接

时间:2013-12-11 09:54:52

标签: java string string-concatenation

以下陈述,

String string = "string";   

string = string +((char)65) + 5;
System.out.println(string);

生成输出stringA5


以下,

String string = "string";

string += ((char)65) + 5;
System.out.println(string);

制作string70

区别在哪里?

5 个答案:

答案 0 :(得分:70)

作为运算符优先级和字符串转换组合的结果,您会看到此行为。

JLS 15.18.1州:

  

如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。

因此,第一个表达式中的右手操作数会隐式转换为字符串:string = string + ((char)65) + 5;

对于第二个表达式string += ((char)65) + 5;+=复合赋值运算符必须与+一起考虑。由于+=弱于+,因此首先评估+运算符。我们有一个char和一个 int ,结果是binary numeric promotionint。仅评估+=,但此时已经评估了涉及+运算符的表达式的结果。

答案 1 :(得分:16)

案例1

string = string +((char)65) + 5;

所有内容都被视为字符串,但在第二种情况下

执行的操作顺序:

  • string +((char)65 = stringA
  • stringA + 5 = stringA5

案例2

 string += ((char)65) + 5;

计算第一个右侧意味着第一个操作将类似((char)65) + 5,因此((char)65) + 5 is 70的结果和之后的操作+ =操作。

执行的操作顺序:

  • (char)65 + 5 = 70
  • string + 70 = string70

让我们再看一个例子

String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string); 

输出 string70A

<强>原因 计算相同的第一右侧并且执行的操作的序列是

  • (char)65 + 5 = 70
  • 70 + "A" = 70A
  • string + 70A = string70A

答案 2 :(得分:5)

当你写:

string = string + ((char)65) + 5;

就像写作:

String string =
     new StringBuilder(string).append((char)65).append((int)5).toString();

这就像将string附加到A(十进制65的字符表示)和5

在后者中,您首先计算右手,然后将结果添加到string,这就像写作:

string = string + 70;

答案 3 :(得分:3)

string = string +((char)65) + 5;

这意味着“将字符串设置为string((char)65)5的串联。”这将从左到右进行评估(首先是string + ((char)65),然后是+5,并且字符串和整数的连接将该整数转换为字符串。

string += ((char)65) + 5;

这意味着“计算((char)65)+5的结果并将其添加到字符串” - 在将结果添加到字符串之前评估整个右侧。由于char实际上只是一个16位整数,因此它将它们作为整数相加 - 得到70 - 然后将其附加到string

答案 4 :(得分:0)

与示例相同:

System.out.println("abc"+10 + 5);

生成abc105(add as String)

System.out.println(5 + 10);

生成15(添加为数字)

操作的(第一位)中包含的String强制所有元素在执行操作时被视为Strings。但是在+=的情况下,由于运算符优先级,操作首先在右侧部分执行(将元素视为int),然后与String连接。