字符串和字符的连接

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;+=化合物赋值运算符具有沿要考虑+.由于+=弱于+,因此+首先评估操作员.在那里,我们有一个charINT这会导致二进制数值提升int.仅+=对此进行评估,但此时+已经评估了涉及运算符的表达式的结果.


Ash*_*wal 16

情况1

string = string +((char)65) + 5;
Run Code Online (Sandbox Code Playgroud)

一切都被视为字符串,但在第二种情况下

执行的操作顺序:

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

案例2

 string += ((char)65) + 5;
Run Code Online (Sandbox Code Playgroud)

第一个右侧计算意味着第一个操作将是((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); 
Run Code Online (Sandbox Code Playgroud)

输出字符串70A

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

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


Mar*_*oun 5

当你写:

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)

这就像是附加stringA(小数65的char表示)和5.

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

string = string + 70;
Run Code Online (Sandbox Code Playgroud)