java面試(8)

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,第七行判斷同第五行。

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