java1.8 intern方法

intern方法

java 对这个方法的解释:
返回字符串对象的规范表示形式。

作用:String.intern()方法可以用来处理在Java中字符串的重复问题。
比如接口返回一个字符串,你要保存那个字符串,你就调用intern保存他的规范表示形式(即常量池上的),接口那个字符串就能垃圾回收。直接报错返回的对象字符串,如果有大量重复的,这些字符串对象就会很多。
在这里插入图片描述

这个方法应该是这样的逻辑

String intern() {
     if(常量池找到该字面量的字符串) {
         return 常量池该字面量的字符串
    }
    if(常量池已经记录字符串字面量相等的引用) {
        return A
   }
    记录 堆上第一个与该字符串字面量相等的引用
    return 记录的引用
}
intern方法在1.7和1.6及之前差异

字面量:指的是String的值,两个字符串equals为true,字面量相同

  1. jdk1.6及之前
  • 如果常量池存在该字面量的字符串,返回这个常量池的对象引用
  • 常量池不存在这个字面量的字符串,a.intern()会常量池创建字面量一样的字符串,返回常量池(新建)的对象引用
  1. jdk1.7及之后
  • 如果常量池存在该字面量的字符串,返回这个常量池的对象的引用(同1.6)
  • 如常量池不存在字面量的对象,在常量池中记录首次出现的实例引用。调用intern()返回这个引用。
请问下面两个输出是什么?(jdk1.7及之后)

在这里插入图片描述
答案是:
在这里插入图片描述

具体分析

都是1.8上运行的

对于s1
  • String s1 = new String(“123”);堆上创建123字符串,常量池创建123字符串对象。(第一次运行,之前常量池是空的,没有123字符串)
  • String internS1 = s1.intern();intern()方法找到常量池上“123”字面量的字符串,返回这个引用
  • String poolsS1 = “123”;poolsS1 指向常量池创建的123字符串

poolsS1 == internS1 != S1

对于s2:
  • String s2 = new String(“Hel”) + new String(“lo”);常量池有"hell"和“lo”字符串对象,堆上“hello”字符串对象
  • String internS2 = s2.intern();intern()方法在常量池中记录首次出现的实例(堆上)的引用,返回第一次hello的字符串

poolsS2 == internS2 == S2

扩展一下

s2,s22,poolsS2,internS2 哪些是相等的,(打印地址,地址相等代表对象是一个)
在这里插入图片描述
在这里插入图片描述

可以发现
s2 == poolsS2 == internS2 != S22

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值