关于Java中的String.intern()

最近在读深入理解Java虚拟机这本书,关于书中提到的String.intern函数做一个记录。

String.intern作用:如果字符串常量池中已经存在这样的一个字符串实例的时候,就返回代表池中这个字符串的String对象,否则就将String对象包含的字符串变量添加到常量池中。

首先,在Jdk1.6中String.intern是需要复制实例到永久代中的,返回的是永久代中的字符串实例的引用。

而在1.7以及以上不会再复制实例,而是在常量区中记录首次出现的实例对象,相当于一个指针的形式。

String str2=new StringBuilder("计算").append("机").toString();
System.out.println(str.intern()==str);

在Jdk1.6中的结果是false,而在1.7及以上的结果就是true。

分析:Jdk1.6中string.intern指向的地址是在永久代中的地址,而右边的StringBuilder对象在堆中,他们两者的地址当然不同。

Jdk1.7中其实指向的就是堆中的这个实例。只不过指针记录在常量区中。

实验环境:Jdk1.8

String r=new String("java");
System.out.println(r.intern()==r);
String test="test";
String l=new String("test");
System.out.println(l.intern()==l);
System.out.println(l.intern()==test);

两个的输出结果都是false,false。最后一个的输出结果是true。

第一个结果的false,是因为常量区中本身存在Java的变量。因此输出结果是false。

第二个输出结果是false,是因为我们在常量区定义了一个test的字符串,因此l.intern()返回的实际上是我们定义的常量的地址。

第三个输出结果证明上面的分析过程。

也就是常量池中存在实例的时候,直接返回常量池中的实例。

你可能感兴趣的:(Java虚拟机)