与String常量池相关的查询

时间:2013-10-18 18:06:55

标签: java string immutability

PFB我试图理解的一段代码。

public static void main(String[] args) {

    String s1 = "dexter7";
    String s2 = "dexter" + "7";

    System.out.println(s1==s2); //line 1 - Output is true

    String s3 = "dexter" + s1.length();

    System.out.println(s1==s3); //line 2 - Output is false

}

根据字符串常量池的概念,如果常量池中存在String值,则将重用它,而不是创建新的String,除非“new”关键字在图片中。

那么为什么考虑到第1行和第1行的输出,上述片段中的这种行为会发生变化?第2行标记在上面的代码段中。

任何人都可以帮助我理解这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

s1.length()不是在编译时评估,而是在运行时评估

String s3 = "dexter" + s1.length();

将编译成

String s3 = new StringBuilder("dexter").append(s1.length()).toString();

toString将在内部使用new String(...)来创建s3,因此它不会来自字符串池。


另一方面

String s2 = "dexter" + "7";

由编译器连接并编译成

String s2 = "dexter7";

所以s2s1的字符串文字相同。