public class Main {
public static void main(String[] args) {
String a = new String("11") ;
a.intern();
String b = "11";
System.out.println(a == b); // false
String c = new String("2") + new String("2");
c.intern();
String d = "22";
System.out.println(c == d); // true
}
}
打印:
false
true
我在jkd 1.8上运行它。我很困惑为什么第二个println结果。
答案 0 :(得分:3)
String
文字在第一次显示时始终会自动实现。您代码中的String
文字是" 11"和" 2"。
另一方面,由于String
连接而创建的String
不会自动实现。
String a = new String("11"); // interns the String literal "11", and creates a
// different String instance referenced by a
a.intern(); // doesn't add a to the String pool, since "11" is already in
// the String pool
String b = "11"; // "11" returns the canonical instance already in the pool,
// which is != a
因此a != b
。
String c = new String("2") + new String("2"); // interns the String "2", creates 2
// more Strings having the same value,
// and creates an additional String
// whose value is "22", which is not
// interned yet
c.intern(); // c is added to the String pool as the canonical instance whose value
// is "22"
String d = "22"; // "22" returns the canonical instance already in the pool,
// which is == c
因此c == d
。
以上所有内容均来自intern
的Javadoc:
返回字符串对象的规范表示。
字符串池(最初为空)由String类私有维护。
调用实习方法时,如果池已包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用。
接下来,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。
所有文字字符串和字符串值常量表达式都是实现的。字符串文字在The Java™语言规范的3.10.5节中定义。