今天去面試的時候碰到了這個問題:String str = new String("abc"); 建立了幾個對象,回來本身研究並查閱資料才發現答錯了。。
網上的爭論很多,有的說是兩個,答案應該是:兩個或一個java
理由解釋以下:
都瞭解java 的字符串常量緩衝區(字符串池,字符串常量池),
若是代碼是這樣的:面試
[java] view plain copy緩存
而且 abc 字符串以前沒有用過,這毫無疑問建立了兩個對象,一個是new String 建立的一個新的對象,一個是常量「abc」對象的內容建立出的一個新的String對象,測試
可是若是代碼是這樣子的:.net
[java] view plain copy對象
嗯,建立幾個就很差說了,咱們仍是測試一下吧,首先咱們打開cmd.exe, 經過javac *.java編譯好該Java文件,而後經過命令javap -c *來查看java編譯後的ByteCode字節碼,blog
ldc的含義是:將常量值從常量池中取出來而且壓入棧中。從上圖中,咱們能夠看到第0行和第7行中的字符串引用是同一個,這說明了,在編譯期間,該字符串變量的值已經肯定了下來,而且將該字符串值緩存在緩衝區中,同時讓該變量指向該字符串值,後面若是有使用相同的字符串值,則繼續指向同一個字符串值字符串
因此String str2 = new String("abc"); 此時就建立一個對象,而abc 則是從字符串常量緩衝區中取出來的。get
ok。就是這個樣子。cmd