String、StringBuffer和StringBuilder的區(qū)別

概念:

1、用來(lái)處理字符串常用的類有3種:String、StringBuffer和StringBuilder

2、三者之間的區(qū)別:

都是final類,都不允許被繼承;

String類長(zhǎng)度是不可變的,StringBuffer和StringBuilder類長(zhǎng)度是可以改變的;

StringBuffer類是線程安全的,StringBuilder不是線程安全的;

String 和 StringBuffer:

1、String類型和StringBuffer類型的主要性能區(qū)別:String是不可變的對(duì)象,因此每次在對(duì)String類進(jìn)行改變的時(shí)候都會(huì)生成一個(gè)新的string對(duì)象,然后將指針指向新的string對(duì)象,所以經(jīng)常要改變字符串長(zhǎng)度的話不要使用string,因?yàn)槊看紊蓪?duì)象都會(huì)對(duì)系統(tǒng)性能產(chǎn)生影響,特別是當(dāng)內(nèi)存中引用的對(duì)象多了以后,JVM的GC就會(huì)開(kāi)始工作,性能就會(huì)降低;

2、使用StringBuffer類時(shí),每次都會(huì)對(duì)StringBuffer對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象并改變對(duì)象引用,所以多數(shù)情況下推薦使用StringBuffer,特別是字符串對(duì)象經(jīng)常要改變的情況;

3、在某些情況下,String對(duì)象的字符串拼接其實(shí)是被Java Compiler編譯成了StringBuffer對(duì)象的拼接,所以這些時(shí)候String對(duì)象的速度并不會(huì)比StringBuffer對(duì)象慢,例如:

String s1 = “This is only a” + “ simple” + “ test”;

StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

生成 String s1對(duì)象的速度并不比 StringBuffer慢。其實(shí)在Java Compiler里,自動(dòng)做了如下轉(zhuǎn)換:

Java Compiler直接把上述第一條語(yǔ)句編譯為:

String s2 = “This is only a”;

String s3 = “ simple”;

String s4 = “ test”;

String s1 = s2 + s3 + s4;

這時(shí)候,Java Compiler會(huì)規(guī)規(guī)矩矩的按照原來(lái)的方式去做,String的concatenation(即+)操作利用了StringBuilder(或StringBuffer)的append方法實(shí)現(xiàn),此時(shí),對(duì)于上述情況,若s2,s3,s4采用String定義,拼接時(shí)需要額外創(chuàng)建一個(gè)StringBuffer(或StringBuilder),之后將StringBuffer轉(zhuǎn)換為String;若采用StringBuffer(或StringBuilder),則不需額外創(chuàng)建StringBuffer

StringBuilder

StringBuilder是5.0新增的,此類提供一個(gè)與 StringBuffer 兼容的 API,但不保證同步。該類被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能,建議優(yōu)先采用該類,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)中,它比 StringBuffer 要快。兩者的方法基本相同

使用策略

1、基本原則:如果要操作少量的數(shù)據(jù),用String ;單線程操作大量數(shù)據(jù),用StringBuilder ;多線程操作大量數(shù)據(jù),用StringBuffer。

2、不要使用String類的”+”來(lái)進(jìn)行頻繁的拼接,因?yàn)槟菢拥男阅軜O差的,應(yīng)該使用StringBuffer或StringBuilder類,這在Java的優(yōu)化上是一條比較重要的原則,例如:

String result = "";

for (String s : hugeArray) {

result = result + s;

}

// 使用StringBuilder

StringBuilder sb = new StringBuilder();

for (String s : hugeArray) {

sb.append(s);

}

String result = sb.toString();

當(dāng)出現(xiàn)上面的情況時(shí),顯然我們要采用第二種方法,因?yàn)榈谝环N方法,每次循環(huán)都會(huì)創(chuàng)建一個(gè)String result用于保存結(jié)果,除此之外二者基本相同

3、 StringBuilder一般使用在方法內(nèi)部來(lái)完成類似”+”功能,因?yàn)槭蔷€程不安全的,所以用完以后可以丟棄。StringBuffer主要用在全局變量中

4、相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。而在現(xiàn)實(shí)的模塊化編程中,負(fù)責(zé)某一模塊的程序員不一定能清晰地判斷該模塊是否會(huì)放入多線程的環(huán)境中運(yùn)行,因此:除非確定系統(tǒng)的瓶頸是在 StringBuffer 上,并且確定你的模塊不會(huì)運(yùn)行在多線程模式下,才可以采用StringBuilder;否則還是用StringBuffer

最后編輯于
?著作權(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)容