字符串引用

时间:2016-02-17 12:57:21

标签: java

String s1 = "String";
String s2 = "String" + "";
String s3 = "" + s2;
System.out.println (s1 == s2);
System.out.println (s2 == s3);
System.out.println (s1 == s3);

true 
false 
false

为什么我会得到错误的值?在字符串池中不应该是s3变量吗?它是一样的。我似乎完全不理解字符串池。

2 个答案:

答案 0 :(得分:6)

由于您的字符串未标记为final,因此它们将在运行时使用StringBuilder创建(当您使用+操作并连接字符串时)并且不会进入字符串常量池。如果你希望在加载类时让字符串进入StringPool(就像文字一样),你应该将它们标记为final,从而使它们成为常量。

像这样:

public static void main(String[] args) {
    final String s1 = "String";  // "String" will go into the constants pool even without `final` here. 
    final String s2 = "String" + ""; // Goes into the String constants pool now.
    final String s3 = "" + s2; // Goes into the String constants pool now.
    System.out.println (s1 == s2);
    System.out.println (s2 == s3);
    System.out.println (s1 == s3);
}

O / P:

true
true
true

答案 1 :(得分:0)

问题是"" + s2不是常量表达式(请参阅corresponding section of the JLS)。只需要实现类型String的常量表达式,虽然不要求非常量表达式不被实现,但JVM不会。

如果你写:

String s1 = "String";
final String s2 = "String" + "";
String s3 = "" + s2;
System.out.println (s1 == s2);
System.out.println (s2 == s3);
System.out.println (s1 == s3);

然后"" + s2"是一个常量表达式,您的代码段的结果将是

true
true
true