1. 程式人生 > >面試題之String str = new String("abc"); 建立了幾個物件

面試題之String str = new String("abc"); 建立了幾個物件

今天去面試的時候碰到了這個問題:String str = new String("abc"); 建立了幾個物件,回來自己研究並查閱資料才發現答錯了。。
網上的爭論不少,有的說是兩個,答案應該是:兩個或一個
理由解釋如下:
都瞭解java 的字串常量緩衝區(字串池,字串常量池),
如果程式碼是這樣的:
String str2 = new String("abc");

並且 abc 字串之前沒有用過,這毫無疑問建立了兩個物件,一個是new  String 建立的一個新的物件,一個是常量“abc”物件的內容創建出的一個新的String物件,

但是如果程式碼是這樣子的:

		String str1 = "abc";
		
		String str2 = new String("abc");

嗯,建立幾個就不好說了,我們還是測試一下吧,首先我們開啟cmd.exe, 通過javac *.java編譯好該Java檔案,然後通過命令javap -c *來檢視java編譯後的ByteCode位元組碼,


ldc的含義是:將常量值從常量池中取出來並且壓入棧中。從上圖中,我們可以看到第0行和第7行中的字串引用是同一個,這說明了,在編譯期間,該字串變數的值已經確定了下來,並且將該字串值快取在緩衝區中,同時讓該變數指向該字串值,後面如果有使用相同的字串值,則繼續指向同一個字串值

所以String str2 = new String("abc"); 此時就建立一個物件,而abc 則是從字串常量緩衝區中取出來的。

ok。就是這個樣子。