|
今天去面試的時(shí)候碰到了這個(gè)問(wèn)題:String str = new String("abc"); 創(chuàng)建了幾個(gè)對(duì)象,回來(lái)自己研究并查閱資料才發(fā)現(xiàn)答錯(cuò)了。。 網(wǎng)上的爭(zhēng)論不少,有的說(shuō)是兩個(gè),答案應(yīng)該是:兩個(gè)或一個(gè) 理由解釋如下: 都了解java 的字符串常量緩沖區(qū)(字符串池,字符串常量池), 如果代碼是這樣的:
并且 abc 字符串之前沒(méi)有用過(guò),這毫無(wú)疑問(wèn)創(chuàng)建了兩個(gè)對(duì)象,一個(gè)是new String 創(chuàng)建的一個(gè)新的對(duì)象,一個(gè)是常量“abc”對(duì)象的內(nèi)容創(chuàng)建出的一個(gè)新的String對(duì)象,
但是如果代碼是這樣子的:
嗯,創(chuàng)建幾個(gè)就不好說(shuō)了,我們還是測(cè)試一下吧,首先我們打開(kāi)cmd.exe, 通過(guò)javac *.java編譯好該Java文件,然后通過(guò)命令javap -c *來(lái)查看java編譯后的ByteCode字節(jié)碼,
ldc的含義是:將常量值從常量池中取出來(lái)并且壓入棧中。從上圖中,我們可以看到第0行和第7行中的字符串引用是同一個(gè),這說(shuō)明了,在編譯期間,該字符串變量的值已經(jīng)確定了下來(lái),并且將該字符串值緩存在緩沖區(qū)中,同時(shí)讓該變量指向該字符串值,后面如果有使用相同的字符串值,則繼續(xù)指向同一個(gè)字符串值 所以String str2 = new String("abc"); 此時(shí)就創(chuàng)建一個(gè)對(duì)象,而abc 則是從字符串常量緩沖區(qū)中取出來(lái)的。 ok。就是這個(gè)樣子。
|
|
|