1。
public static void main(String[] args) {
String str = new String("good"); //執行到這一行時,創建了幾個對象
String str1 = "good";//執行到這一行時,創建了幾個對象
String str2 = new String("good");//執行到這一行時,創建了幾個對象
System.out.println(str == str1);//輸出結果是什麼
System.out.println(str.equals(str2));//輸出結果是什麼
System.out.println(str2 == str1);//輸出結果是什麼
}
分析:
String pool(String 池)也就是內存的數據段區,專門存放靜態變量和字符串的區,如String a = "abc";那麼字符串"abc"就存放在String pool中,如果是String str = new String("good"); 就放在內存的heap(堆)裏面。
java執行第二行時,首先在String pool中查找有沒有字符串常量“good”,因爲沒有所以創建“good”的對象,當執行new String(“good”)時,則在java的堆中創建一個“good”對象,而str則是該對象的引用,因此共創建兩個對象。
執行第三行時,首先還是在String pool中查找有沒有字符串常量“good”,有則不進行再次創建,直接將str1作爲String pool中“good”對象的一個引用,當你重新聲明一個String型變量“good”時,將使用池裏原來的那個“good”,而不重新分配內存,也就是說str與str1指向同一塊內存。因此此時沒有創建對象。
執行第四行時,依舊在String pool中查找有沒有字符串常量“good”,有則不進行再次創建,由於這裏用了new關鍵字(有new就有對象),所以便在java堆中又創建了一個“good”對象(地址與第一句在堆中的地址不同),而str2則是這個對象的引用,因此執行此句只創建了一個對象。
執行第五行時,我們知道“==”是判斷對象的,因此由於str指向的是java堆中的“good”對象,而str1指向的則是String pool中的“good”對象,所以輸出FALSE
執行第六行時,由於String類中的equals方法判斷的是對象的內容而不是內存地址,由於所有的內容都是good,所以返回TRUE,第七行判斷同第五行。