1、初始化:
一般由String聲明的字符串,長度是不可變的,這也是它與StringBuffer和StringBuilder最直觀的一個區(qū)別。一般初始化方式:String s = "hello world";經(jīng)過這條語句,JVM的棧內(nèi)存中產(chǎn)生一個s變量,堆內(nèi)存中產(chǎn)生hello world字符串對象。s指向了hello world的地址。像上面這種方式產(chǎn)生的字符串屬于直接量字符串對象,JVM在處理這類字符串的時候,會進行緩存,產(chǎn)生時放入字符串池,當程序需要再次使用的時候,無需重新創(chuàng)建一個新的字符串,而是直接指向已存在的字符串。
2、String s = "123" + "456"內(nèi)存中產(chǎn)生幾個字符串對象?
這是個比較有爭議的問題,面試的時候,老師還挺喜歡問,論壇上大家說幾個的也有,我給大家分析一下,因為我們前面有提到Java字符串的緩存機制,編譯器在編譯的時候會進行優(yōu)化,所以在編譯的過程中123和456被合成了一個字符串"123456",因此,如果緩存池中目前沒有123456這個對象,那么會產(chǎn)生一個,即""123456",且棧中產(chǎn)生一個引用s指向它,如果緩存池中已經(jīng)存在"123456",那么將產(chǎn)生0個對象,直接用s指向它。
3、StringBuffer、StringBuilder
StringBuffer和StringBuilder就是所謂的可變字符串類,共四個構(gòu)造方法:
StringBuffer()
public StringBuffer(int paramInt)
public StringBuffer(String paramString)
public StringBuffer(CharSequence paramCharSequence)
觀察其源碼發(fā)現(xiàn),使用StringBuffer()時,默認開辟16個字符的長度的空間,使用public StringBuffer(int paramInt)時開辟指定大小的空間,使用public StringBuffer(String paramString)時,開辟paramString.length+16大小的空間。都是調(diào)用父類的構(gòu)造器super()來開辟內(nèi)存。這方面StringBuffer和StringBuilder都一樣,且都實現(xiàn)AbstractStringBuilder類。
二者幾乎沒什么區(qū)別,基本都是在調(diào)用父類的各個方法,一個重要的區(qū)別就是StringBuffer是線程安全的,內(nèi)部的大多數(shù)方法前面都有關(guān)鍵字synchronized,這樣就會有一定的性能消耗,StringBuilder是非線程安全的,所以效率要高些。
2015職稱計算機考試書PowerPoint2007中 .. 定價:¥45 優(yōu)惠價:¥42 更多書籍 | |
2015年全國職稱計算機考試教材(2007模 .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 |