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变量吗?它是一样的。我似乎完全不理解字符串池。
答案 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