关于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()放进做一次同样的放入操作,可以发现后者可以节省更多的内存消耗,可以通过一些内存分析工具进行查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值