英文:
Difference between + and += on Java Strings
问题
我想了解在Java中使用+和+=操作字符串时内存是如何分配的。
我知道字符串字面值存储在字符串常量池中,在情况#1中,s1和s2都引用字符串常量池中相同的内存。
在情况#2中,即使我使用+运算符,它仍然引用字符串常量池中的相同对象。
我发现有趣的是情况#3。在这种情况下,内存是如何分配的?它与情况#2有何不同?
// 情况#1
String s1 = "Hello Java";
String s2 = "Hello Java";
System.out.println(s1 == s2); //true
// 情况#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
英文:
I would like to understand how memory is allocated when we use + and += on Strings in Java.
I know that String literals are stored in the String Constant Pool and in Case #1, both s1 and s2 reference the same memory in String Constant Pool.
In Case #2, eventhough I use a + operator, it still references the same object in String Constant Pool
What I find interesting is Case #3. How and where is memory allocated in this case? How is it different from Case #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
得分: 14
这实际上并不是+
和+=
之间的区别;如果您写成以下方式,您会得到与情况#3相同的行为:
s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false
在情况#2中看到的行为的原因是"Hello" + " Java"
是一个常量表达式,因此它实际上可以在编译时处理,就像它是"Hello Java"
一样,并且需要像"Hello Java"
一样进行汇编处理。
当您将其拆分为单独的语句时,情况就不同了,所以您会得到一个新创建的字符串。
英文:
This isn't actually a difference between +
and +=
; you'd get the same behavior as Case #3 if you wrote:
s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false
The reason for the behavior you see in Case #2 is that "Hello" + " Java"
is a constant expression [JLS8 §15.28], so it can actually be handled at compile-time exactly as if it were "Hello Java"
, and is required to be interned just as "Hello Java"
is.
When you break it up into separate statements, that's no longer the case, so you get a newly created string [JLS8 §15.18.1].
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论