如何创建字符串文字?

时间:2013-05-22 12:11:36

标签: java string

我正在尝试理解字符串常量池,如何在常量池中管理字符串文字对象,我无法理解为什么我从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
 }

2 个答案:

答案 0 :(得分:12)

表达式"abc" + "d"是一个常量表达式,因此连接在编译时执行,导致代码等效于:

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

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

有关常量表达式的详细信息,请参阅section 15.28 of the JLS

答案 1 :(得分:0)

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

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

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