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