關於String的intern的一個題目

public static void main(String[] args) {
    String str1 = new StringBuilder("計算機").append("軟件").toString();
    System.out.println(str1.intern() == str1);
    String str2 = new StringBuilder("ja").append("va").toString();
    System.out.println(str2.intern() == str2);
}

輸出結果
true
false

intern方法之前是在常量池尋找有沒有這個字符串,如果有就返回它,沒有就在常量池
創建一個,但是在jdk1.7之後,只是在常量池中記錄首次出現的實例引用,
也就是 例如有 堆中的一個字符串對象,他只會把這個引用給複製過去

在這個題目裏

 public synchronized String toString() {
        return new String(value, 0, count);
    }

第一個當調用toString方法的時候,會在堆中創建一個對象,當第二次調用intern方法的時候,會返回這個對象的引用,因此爲true

第二個因爲java這個字符串已經在常量池中存在了,所以返回的肯定不會是你新創建的對象,所以爲false
加載java這個字符串應該是在System類中,有個靜態變量
private static final String launcher_name = “java”;

new String(value, 0, count); 和 new String(“XX”)是不同的,不用去考慮這個。

發佈了65 篇原創文章 · 獲贊 29 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章