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”)是不同的,不用去考慮這個。