我正在尝试理解字符串常量池,如何在常量池中管理字符串文字对象,我无法理解为什么我从false
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abcd";
String s3 = "abc" +"d";
String s4 = s1 + "d";
System.out.println(s2 == s3); // OP: true
System.out.println(s2 == s4); // OP: false
}
答案 0 :(得分:12)
表达式"abc" + "d"
是一个常量表达式,因此连接在编译时执行,导致代码等效于:
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcd";
String s4 = s1 + "d";
表达式s1 + "d"
不是一个常量表达式,因此在执行时执行,创建一个新的字符串对象。因此,虽然s2
和s3
引用相同的字符串对象(由于常量字符串实习),但s2
和s4
引用不同(但相等)的字符串对象。
有关常量表达式的详细信息,请参阅section 15.28 of the JLS。
答案 1 :(得分:0)
s2
是在编译时创建的。内存是为它保留的并相应地填充。
s1 + "d"
在运行时进行评估。因为你使用两个不同的字符串(即。s1
是一个理论上可以是任何东西的变量),编译器无法事先知道你不打算改变对象引用的值。
因此,它必须动态分配内存。