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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章