当前位置: 代码迷 >> 综合 >> JDK1.7前后 intern()方法的变动
  详细解决方案

JDK1.7前后 intern()方法的变动

热度:0   发布时间:2023-12-18 09:31:54.0

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是堆中的对象,所以不相等