【发布时间】:2013-02-23 18:20:21
【问题描述】:
我已经阅读了this answer 关于如何检查一个字符串是否在 Java 中的实习,但我不明白以下结果:
String x = args[0]; // args[0] = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // true
但是如果我声明一个字符串文字:
String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false
此外,没有任何字符串文字,args[0] 似乎直接被实习:
// String x = "abc";
String y = args[0];
System.out.println(y.intern() == y); // true (???)
// false if the first line is uncommented
为什么y.intern() == y 会根据x 是否为文字而改变,即使对于使用命令行参数的示例也是如此?
我知道literal strings are interned at compile time,但我不明白为什么它会影响前面的示例。我还阅读了一些关于字符串实习的问题,例如 String Pool behavior、Questions about Java's String pool 和 Java String pool - When does the pool change?。但是,他们都没有对这种行为给出可能的解释。
编辑:
我错误地写道,在第三个示例中,如果声明了String x = "abc";,结果不会改变,但确实如此。
【问题讨论】:
-
我在所有情况下都是假的
-
-
这种行为有点吓人……
-
@HotLicks - 仅当变量声明为 final 时。
-
@MartijnCourteaux - 不知道你为什么说“可怕”。给定的字符串值可能已经或可能尚未被实习 - 可能在一小时前采用不同的方法。此外,
intern()不能保证返回原始字符串,即使它是第一个这样的字符串 - 它可能会返回一个副本。