關於Java中的String.intern()

最近在讀深入理解Java虛擬機這本書,關於書中提到的String.intern函數做一個記錄。

String.intern作用:如果字符串常量池中已經存在這樣的一個字符串實例的時候,就返回代表池中這個字符串的String對象,否則就將String對象包含的字符串變量添加到常量池中。

首先,在Jdk1.6中String.intern是需要複製實例到永久代中的,返回的是永久代中的字符串實例的引用。

而在1.7以及以上不會再複製實例,而是在常量區中記錄首次出現的實例對象,相當於一個指針的形式。

String str2=new StringBuilder("計算").append("機").toString();
System.out.println(str.intern()==str);

在Jdk1.6中的結果是false,而在1.7及以上的結果就是true。

分析:Jdk1.6中string.intern指向的地址是在永久代中的地址,而右邊的StringBuilder對象在堆中,他們兩者的地址當然不同。

Jdk1.7中其實指向的就是堆中的這個實例。只不過指針記錄在常量區中。

實驗環境:Jdk1.8

String r=new String("java");
System.out.println(r.intern()==r);
String test="test";
String l=new String("test");
System.out.println(l.intern()==l);
System.out.println(l.intern()==test);

兩個的輸出結果都是false,false。最後一個的輸出結果是true。

第一個結果的false,是因爲常量區中本身存在Java的變量。因此輸出結果是false。

第二個輸出結果是false,是因爲我們在常量區定義了一個test的字符串,因此l.intern()返回的實際上是我們定義的常量的地址。

第三個輸出結果證明上面的分析過程。

也就是常量池中存在實例的時候,直接返回常量池中的實例。

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