1.6以前版本intern():如果常量池没有这个字符串,则将这个字符串加入到常量池
String s1=new StringBuilder("什").append("么").toString();
// true
System.out.println(s1==s1.intern());
String s2=new StringBuilder("什么").toString();
// true
System.out.println(s2==s2.intern());
1.7以后版本intern():如果常量池没有这个字符串,这会将这对象的引用加入到常量池
String s1=new StringBuilder("什").append("么").toString();
// true
System.out.println(s1==s1.intern());
String s2=new StringBuilder("什么").toString();
// false
System.out.println(s2==s2.intern());
s1==s1.intern()
为true的原因是常量池只有两个字符串分别为“什”和“么”
没有“什么”,所以存储的是“什么”的地址在堆中的位置,s1.intern()返回的是堆中的地址
s2==s2.intern()
为false的原因是常量池有什么这个字符串,所以s2.intern()返回的是常量池里的对象,而s2是堆中的对象,所以不相等