有需要可以查看我的完整思维导图链接:https://blog.csdn.net/qq_22701869/article/details/107525851
目录
System.out.println(str2.intern() == str2);结果是false原因
java虚拟机上的测试代码
public class TestIntern {
public static void main(String[] args) {
//jdk1.6在使用intern()时,会把存储在堆中的‘计算机软件’复制到老年代,返回老年代的引用
//所有str1.intern()返回的是老年代上的引用,str1是初始化在堆上的引用,不相同返回false
//而jdk1.7之后,在使用intern()时,不再复制实例,只是在常量池(属于方法区)中记录首次出现的实例引用
//所有str1.intern()和 str1是同一个引用,结果是true
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
//“java”在常量池中已经存在引用了,而str2是对象在堆中的引用,str2.intern()返回的是常量池中的引用,
//这两个引用自然是不相同的,结果是false
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);
}
}
结果:
jdk1.6
false
false
jdk1.7
true
false
原因图解jdk1.6
原因图解jdk1.7
System.out.println(str2.intern() == str2);结果是false原因
因为java是一个特殊的字符串,在new StringBuilder之前,在方法区的常量池中已经存在了这样一个字符串,在内存中存在如下图