Java 6 和 7 中String.intern返回引用的不同

Java 6 和 7 中String.intern返回引用的不同

先看看下面這段代碼,這段代碼在Java 6 和Java 7中的運行的結果並不同,爲什麼呢?

public class Main {
    public static void main(String[] args) {
        String myString = "Rafe";
        String str1 = new StringBuilder("好好").append("學習").toString();
        System.out.println(str1.intern() == str1);

        String str2 = new StringBuilder("Ra").append("fe").toString();
        System.out.println(str2.intern() == str2);
    }
}

在Java 6 中運行,會得到兩個false。而在Java 7中運行,會得到一個true和一個false。

先分析第一段代碼。原因在於,Java6中字符串常量池是在永久代區。intern方法會將首次遇到的字符串複製到那裏,返回的也是永久代中這個字符串的引用。而通過str1本身是通過StringBuilder構造出來的,是堆內存中的對象。這兩個對象勢必不同,因此返回false。在Java 7 中,字符串常量池被放到了堆中,intern的實現也不再是複製實例,只是在常量池中記錄首次出現的實例引用。此時intern返回的引用和StringBuilder創建的堆對象實則爲同者了。

在看第二段代碼。它在兩個不同版本的Java中結果相同。“Rafe”在此前已經出現過並記錄到了常量池中。而str2的是另外一個由StringBuilder創建的堆對象,只是內容同之前緩存的字符串。無論是java 6中返回的常量池字符串,還是Java 7返回的常量池中記錄的堆對象引用(此引用實則爲myString),都與str2不同,因此輸出false。

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