7

我试图了解字符串常量池,字符串文字对象是如何在常量池中管理的,我无法理解为什么我false从下面的代码中 得到s2 == s4

 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
 }
4

2 回答 2

12

该表达式"abc" + "d"是一个常量表达式,因此连接是在compile-time执行的,导致代码等效于:

String s1 = "abc";
String s2 = "abcd";
String s3 = "abcd";
String s4 = s1 + "d";

该表达式s1 + "d"不是常量表达式,因此在执行时执行,创建一个新的字符串对象。因此虽然s2s3引用相同的字符串对象(由于常量字符串实习),s2s4引用不同(但相等)的字符串对象。

有关常量表达式的更多详细信息,请参阅JLS 的第 15.28 节。

于 2013-05-22T12:13:28.783 回答
0

s2是在编译时创建的。为它保留内存并相应地填充。

s1 + "d"在运行时评估。因为您使用的是两个不同的字符串(即s1是一个理论上可以是任何东西的变量),所以编译器无法提前知道您不打算更改对象引用的值。

因此,它必须动态分配内存。

于 2013-05-22T12:14:48.723 回答