java1.8 intern方法

intern方法

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

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

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

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及之后)

java1.8 intern方法_第2张图片
答案是:
java1.8 intern方法_第3张图片

具体分析

都是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 哪些是相等的,(打印地址,地址相等代表对象是一个)
java1.8 intern方法_第4张图片
java1.8 intern方法_第5张图片

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

你可能感兴趣的:(java)