Tin*_*iny 57 java string string-concatenation
以下陈述,
String string = "string";
string = string +((char)65) + 5;
System.out.println(string);
Run Code Online (Sandbox Code Playgroud)
产生输出stringA5.
但是,以下
String string = "string";
string += ((char)65) + 5;
System.out.println(string);
Run Code Online (Sandbox Code Playgroud)
生产string70.
区别在哪里?
Kai*_*nad 70
作为运算符优先级和字符串转换组合的结果,您会看到此行为.
JLS 15.18.1规定:
如果只有一个操作数表达式是String类型,则对另一个操作数执行字符串转换(第5.1.11节)以在运行时生成字符串.
因此,第一个表达式中的右侧操作数会隐式转换为字符串: string = string + ((char)65) + 5;
对于第二个表达式然而string += ((char)65) + 5;该+=化合物赋值运算符具有沿要考虑+.由于+=弱于+,因此+首先评估操作员.在那里,我们有一个char和INT这会导致二进制数值提升至int.仅+=对此进行评估,但此时+已经评估了涉及运算符的表达式的结果.
Ash*_*wal 16
情况1
string = string +((char)65) + 5;
Run Code Online (Sandbox Code Playgroud)
一切都被视为字符串,但在第二种情况下
执行的操作顺序:
string +((char)65 = stringAstringA + 5 = stringA5案例2
string += ((char)65) + 5;
Run Code Online (Sandbox Code Playgroud)
第一个右侧计算意味着第一个操作将是((char)65) + 5,所以结果((char)65) + 5 is 70和之后+ =操作.
执行的操作顺序:
(char)65 + 5 = 70string + 70 = string70让我们再看一个例子
String string = "string";
string += ((char)65) + 5 + "A";
System.out.println(string);
Run Code Online (Sandbox Code Playgroud)
输出字符串70A
原因 相同的第一个右侧是计算的,并且执行的操作的序列是
(char)65 + 5 = 7070 + "A" = 70Astring + 70A = string70A当你写:
string = string + ((char)65) + 5;
Run Code Online (Sandbox Code Playgroud)
这就像写作:
String string =
new StringBuilder(string).append((char)65).append((int)5).toString();
Run Code Online (Sandbox Code Playgroud)
这就像是附加string到A(小数65的char表示)和5.
在后者中,你首先计算右手,然后将结果添加到string,就像写:
string = string + 70;
Run Code Online (Sandbox Code Playgroud)