如何创建字符串文字?

Sat*_*tya 7 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
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 12

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

String s1 = "abc";
String s2 = "abcd";
String s3 = "abcd";
String s4 = s1 + "d";
Run Code Online (Sandbox Code Playgroud)

表达s1 + "d"恒定的表达,因此在执行执行时间,创建一个新的字符串对象.因此虽然s2并且s3引用相同的字符串对象(由于常量字符串实习),s2并且s4引用不同(但相等)的字符串对象.

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

  • 还要注意,如果你使`s1`结束,第二个比较也将输出'true`,因为在编译时它将被认为是常量. (4认同)
  • @Slanec:它不被语言视为常量表达.请记住调试等情况 - 您可以通过这种方式更改`s1`,这样会很奇怪,以后不会被后来的`s4`赋值.我认为对于这样的情况,简单性和可预测性通常比积极优化更好.虽然字符串连接在某种程度上是*特定于实现的,但我认为它至少会违反JLS的*精神*,因为OP的情况下输出为"true". (3认同)