关于String的intern()方法

 关于String类的intern()方法,平时没怎么用过,在啃JVM这段时间突然遇到这玩意儿,突然发现还挺有意思的,记录下。
 呐,先看例子(直接拿的书中的):

public class StringIntern {
    public static void main(String[] args) {
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern()==str1);

        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern()==str2);
    }
}

输出结果为:true false,jdk是1.8的版本(1.7版本结果一样),1.6版本是两个false。在1.6版本的JDK中,intern()方法会将首次遇见的字符串实例直接复制到永久代中,返回的String是永久代中这个字符串实例的引用,所以第一个比较就是永久代内存上的实例引用和堆内存上(StringBuilder是对象,存放在堆内存上)的实例,所以两者必然不同,而在JDK1.7后,intern()方法不再进行复制这一行为了,只是在常量池中记录首次出现该字符串的引用,返回的和首次出现该字符引用是同一个,所以第一个比较的结果是true,第二个比较也是同样的道理。
intern()方法主要是为了重用String对象,节省内存消耗,可以通过循环创建字符串"xxx"放进数组,为了作比较,再用"xxx".intern()放进做一次同样的放入操作,可以发现后者可以节省更多的内存消耗,可以通过一些内存分析工具进行查看。

猜你喜欢

转载自blog.csdn.net/jacksonary/article/details/80313770