String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
//jdk1.6 false jdk1.7 true
String str2 = new StringBuilder("ass").append("ert").toString();
System.out.println(str2.intern() == str2);
//jdk1.6 false jdk1.7 false
JDK1.6在调用intern 方法时,将字符串实例复制到字符串常量池,返回在字符串常量池的字符串实例的引用。由于字符串在常量池有一个引用,在堆中有一个引用,所以两个引用不是同一个
JDK1.7在调用intern 方法时,只是在常量池中记录首次出现的实例引用。由于“计算机软件”字符串首次出现在了常量池中,所以常量池中保存的引用就是堆中的引用,因此返回true,像”java”,”int”,”float”这样的字符串在类加载完成时就已经存在于字符串常量池中了,所以不是首次出现所以打印false。