Java字符串中"+"和"+="之间的区别

3
我想了解在Java中使用+和+=操作符时内存分配的情况。 我知道字符串字面量被存储在字符串常量池中,在情况#1中,s1和s2都引用字符串常量池中的相同内存。
在情况#2中,即使使用+运算符,它仍然引用字符串常量池中的相同对象。
有趣的是情况#3。在这种情况下内存是如何分配的?它与情况#2有何不同?
//Case #1
String s1 = "Hello Java";
String s2 = "Hello Java";
System.out.println(s1 == s2); //true

//Case #2
s1 = "Hello" + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //true

s1 = "Hello";
s1 += " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

1
使用 equals() 进行字符串比较。 - B001ᛦ
4
我认为OP的意图是要比较对象身份的相同性,而不是字符串的相等性。 - Fred Larson
1个回答

14

实际上,这不是++=之间的区别; 如果你写成以下形式,你将得到与Case#3相同的行为:

s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false
在第二种情况下,您看到的行为是由于“Hello” + “Java”是一个常量表达式 [JLS8 §15.28],因此它实际上可以在编译时处理,就像“Hello Java”一样,并且需要像“Hello Java”一样被联接。
当您将其拆分为单独的语句时,这种情况不再存在,因此会得到一个新创建的字符串 [JLS8 §15.18.1]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接