淺談String,StringBuilder,StringBuffer區(qū)別

首先,說(shuō)一下這三者之間常見的問(wèn)題

1. ?String和new String的區(qū)別

2. ?String和StringBuffer的轉(zhuǎn)換

3. ?String StringBuffer StringBuilder的區(qū)別

4. ?==和equal的區(qū)別、

針對(duì)這四個(gè)問(wèn)題,我們進(jìn)行 一 一 分析

1. ?String str1 =“ABC" ??和 String ?str2 ?= new String("ABC")的區(qū)別 ??

對(duì)于字符串:其對(duì)象是存儲(chǔ)在棧中的""定義的存儲(chǔ)在常量池中 ??new 確定存儲(chǔ)在堆中

相等的字符串在常量池中只有一份,在堆中有多份(String str在棧中 ?“ABC"在常量池中 new String() 在堆中)

String str1="ABC"可能創(chuàng)建一個(gè)對(duì)象或者不創(chuàng)建對(duì)象,

如果"ABC"這個(gè)字符串在java String池里不存在,會(huì)在java String池創(chuàng)建這個(gè)一個(gè)String對(duì)象("ABC")如果已經(jīng)存在,str1直接reference to 這個(gè)String池里的對(duì)象。

String str2 = new String("ABC")至少創(chuàng)建一個(gè)對(duì)象,也可能兩個(gè)。

因?yàn)橛玫絥ew關(guān)鍵字,會(huì)在heap(堆)創(chuàng)建一個(gè) str2 的String 對(duì)象,它的value 是 "ABC".同時(shí),如果"ABC"這個(gè)字符串在java String池里不存在,會(huì)在java String池創(chuàng)建這個(gè)一個(gè)String對(duì)象("ABC").

String str1 = new String(“abc”) ???????str1 != str2 ?????(== 與equals的區(qū)別) ?

String str2 = new String("abc") ??

String str3 = "ABC" ?????????????????????????str3 = str4

String str4 = "ABC" ?????????????????????????str3 = str4 = str5

String str5 = "A"+"BC"; ?

2. String和StringBuffer的轉(zhuǎn)換

2.1? String轉(zhuǎn)StringBuffer:?

StringBuffer sb = new StringBuffer(s); ??String ?s ?= new String("xxx");?

2.2? StringBuffer轉(zhuǎn)String: ?

String str = sb.toString();

3.String和StringBuffer ?StringBuilder的區(qū)別

1) 執(zhí)行速度:StringBulider>StringBuffer>String

2) 變量(常量)線程安全

String ????

常量,不可變的

在進(jìn)行字符串處理時(shí),會(huì)產(chǎn)生新的String對(duì)象 ?????????

添加字符串使用“+” ???????????????????????????????????????????

線程安全

StringBuffer? ?

變量,可以修改內(nèi)容

在進(jìn)行字符串處理時(shí),不會(huì)產(chǎn)生新的String對(duì)象

添加字符是使用append()

線程安全的(多線程程序中可以使用但執(zhí)行效率緩慢)

StringBuilder

? 變量,可以修改內(nèi)容

線程不安全的(單線程中的性能比StringBuffer高)

總結(jié):

1.如果要操作少量的數(shù)據(jù)用 = String

2.單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder

? 3.多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer

4.==和equal的區(qū)別

==是一個(gè)運(yùn)算符 ??equals則是string對(duì)象的方法

==比較的是引用類型 比較的是地址值是否相同

equals比較的是內(nèi)容是否相同(堆中的內(nèi)容是否相同)

擴(kuò)展String的一種方式比StringBuffer快的多 ?

e.g. ?????String ?s ?= "you"+"are"+"better"這種方式比StringBuffer的append()快的多,這就被jvm解析成StringBuffer對(duì)象的拼接 ???

String s = "you" String s2 = "are" ??String s3 = "better" ??String s4 = s+s2+s3這種方式比StringBuffer慢的多這樣jvm就規(guī)規(guī)矩矩的拼接String字符串了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容