intern方法
java 對這個方法的解釋:
返回字符串對象的規範表示形式。
作用:String.intern()方法可以用來處理在Java中字符串的重複問題。
比如接口返回一個字符串,你要保存那個字符串,你就調用intern保存他的規範表示形式(即常量池上的),接口那個字符串就能垃圾回收。直接報錯返回的對象字符串,如果有大量重複的,這些字符串對象就會很多。
這個方法應該是這樣的邏輯
String intern() {
if(常量池找到該字面量的字符串) {
return 常量池該字面量的字符串
}
if(常量池已經記錄字符串字面量相等的引用) {
return A
}
記錄 堆上第一個與該字符串字面量相等的引用
return 記錄的引用
}
intern方法在1.7和1.6及之前差異
字面量:指的是String的值,兩個字符串equals爲true,字面量相同
- jdk1.6及之前
- 如果常量池存在該字面量的字符串,返回這個常量池的對象引用
- 常量池不存在這個字面量的字符串,a.intern()會常量池創建字面量一樣的字符串,返回常量池(新建)的對象引用
- 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