1. 程式人生 > >對String.intern()的理解

對String.intern()的理解

java

一直對String對象裏面的intern()方法不是很了解,最近在讀《深入理解Java虛擬機》這本書裏面終於得到了一個比較清晰的解釋。這個方法是可以獲得一個具體的String在字符串常量池中的一個引用,書裏面有一段實例代碼,

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);

在Java1.7上運行的結果是,

true
false

原因如書上所說的,“計算機軟件”這個字符串是之前沒有出現過的,所以String.intern()在首次遇到沒出現過的字符串時會把其對應在堆上的引用存到字符串常量池中。

但是我對實例代碼中為什麽要用StringBuilder.append()方法有些疑問,所以加了如下代碼,

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

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);

結果卻變成了,

false
false
false

所以我猜測應該是jvm在加載類的時候就已經把代碼中存在的字符串存在常量池中了。原來的例子也是出於這個考慮才用追加的方式來創建字符串,從而達到“首次出現”的目的。

對String.intern()的理解