从JVM内存模型看String.intern() 不等问题

注:JDK1.8
在JDK1.7及以后,字符串常量池从方法区移至堆中,使用intern()方法在常量池中 新增 字符串时,如果新增的字符串已经存在,则直接返回 常量池中的字符串引用地址堆中字符串的引用地址(下图中str6就是这种情况),如果不存在则在常量池创建一个新的对象,并返回中它的引用地址

创建字符串有几种形式

  1. str1 = “首次” ,这种会将 首次 直接加入常量池中
  2. str1 = new String(“首次”),这种形式将先在常量池中创建 首次(如果在常量池不存在才创建) ,然后又在堆中创建一个新的字符串对象,一共创建了2个对象
        String str1 = "首次";
        String str2 = "首次";
        System.out.println(String.format("str1 == str2 ? %s", str2 == str1));

        String str3 = new StringBuilder("首次").toString();
        String str4 = str3.intern();
        System.out.println(String.format("str4 == str3 ? %s", str4 == str3));

        String str5 = str4 + new StringBuilder("出现").toString();
        String str6= str5.intern();
        System.out.println(String.format("str6 == str5 ? %s", str6 == str5));

执行结果:
str1 == str2 ? true
str4 == str3 ? false
str6 == str5 ? true

在这里插入图片描述
深入解析String#intern 参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值