Vai*_*nan 3 java memory string heap-memory string-pool
我想了解当我们在 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
Run Code Online (Sandbox Code Playgroud)
rua*_*akh 14
这实际上不是+和之间的区别+=;如果您写道,您将获得与案例 #3 相同的行为:
s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false
Run Code Online (Sandbox Code Playgroud)
您在案例 #2 中看到的行为的原因是它"Hello" + " Java"是一个常量表达式[ JLS8 §15.28 ],因此它实际上可以在编译时完全像它一样处理"Hello Java",并且需要按原样进行实习"Hello Java"。
当您将其分解为单独的语句时,情况不再如此,因此您将获得一个新创建的字符串 [ JLS8 §15.18.1 ]。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |