先看一段代码
public class TestEquals {
public static void main(String[] args) {
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
// s3.intern();
String s4 = "11";
System.out.println(s3 == s4);
}
}
以下是 java se8虚拟机规范中的原文
为了得到字符常量,Java虚拟机需要检查CONSTANT_String_info结构中的码点序列。
1,如果某String实例所包含的Unicode码点序列与CONSTANT_String_info结构所给出的序列相同,而之前又曾在该实例上面调用过Sting.intern方法,那么此次字符常量获取的结果将是一个指向相同String实例的引用。
2,否则,会创建一个新的String实例,其中包含由CONSTANT_String_info结构所给出的Unicode码点序列;字符常量获取的结果是指向那个新String实例的引用。最后,新String实例的intern方法被Java虚拟机自动调用。