英文:
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].
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论