String StringBuilder StringBuffer三者之间的区别~~~
? ?String StringBuilder? StringBuffer三者之間的區(qū)別~~~
String是字符串常量,它是典型的immutable類,被聲明final?class,所有的屬性都是final,由于它的不變性,類似拼接,剪裁字符串等操作,都會(huì)產(chǎn)生新的對(duì)象,一旦創(chuàng)建,就不能改變了;
StringBuilder和StringBuffer是字符串變量,可以后期增加或減少;
StringBuilder是線程不安全的,其里面的方法實(shí)現(xiàn)并沒有使用關(guān)鍵字?synchronized,適合用在單線程;
StringBuffer是線程安全的可修改字符串,它保證了線程安全,也隨之帶來了額外的性能開銷,出給特殊強(qiáng)調(diào),不然其還是推薦使用它的后繼者,StringBuilder,StringBuffer里面的方法實(shí)現(xiàn)有使用synchronized關(guān)鍵字,適合用于多線程。
運(yùn)行速度:String < StringBuffer <StringBuilder
eg:StringBuilder sb = new StringBuilder().append("abc").append("bcd");
System.out.println(StringBuilder.toString(sb));
更加詳細(xì)的分析:
1 String
(1) String的創(chuàng)建機(jī)理
舉例:String str1 = "123"; //通過直接量賦值方式, 放入字符串常量池
String str2 = new String(“123”);//通過new方式賦值方式, 不放入字符串常量池
注意: String提供了inter()方法。調(diào)用該方法時(shí),如果常量池中包括了一個(gè)等于此String對(duì)象的字符串(由equals方法確定),則返回池中的字符串。否則,將此String對(duì)象添加到池中,并且返回此池中對(duì)象的引用。
(2) String的特性
[A] 不可變。是指String對(duì)象一旦生成,則不能再對(duì)它進(jìn)行改變。不可變的主要作用在于當(dāng)一個(gè)對(duì)象需要被多線程共享,并且訪問頻繁時(shí),可以省略同步和鎖等待的時(shí)間,從而大幅度提高系統(tǒng)性能。 不可變模式是一個(gè)可以提高多線程程序的性能,降低多線程程序復(fù)雜度的設(shè)計(jì)模式。
[B] 針對(duì)常量池的優(yōu)化。當(dāng)2個(gè)String對(duì)象擁有相同的值時(shí),他們 只引用常量池中的同一個(gè)拷貝。當(dāng)同一個(gè)字符串反復(fù)出現(xiàn)時(shí),這個(gè)技術(shù)可以大幅度節(jié)省內(nèi)存空間。
2 StringBuffer/StringBuilder
StringBuffer和StringBuilder都實(shí)現(xiàn)了 AbstractStringBuilder抽象類,擁有幾乎一致對(duì)外提供的調(diào)用接口; 其底層在內(nèi)存中的存儲(chǔ)方式與String相同,都是以一個(gè)有序的字符序列(char類型的數(shù)組)進(jìn)行存儲(chǔ),不同點(diǎn)是StringBuffer/StringBuilder對(duì)象的值是可以改變的,并且值改變以后,對(duì)象引用不會(huì)發(fā)生改變;兩者對(duì)象在構(gòu)造過程中,首先按照默認(rèn)大小申請(qǐng)一個(gè)字符數(shù)組,由于會(huì)不斷加入新數(shù)據(jù),當(dāng)超過默認(rèn)大小后,會(huì)創(chuàng)建一個(gè)更大的數(shù)組,并將原先的數(shù)組內(nèi)容復(fù)制過來,再丟棄舊的數(shù)組。因此,對(duì)于較大對(duì)象的擴(kuò)容會(huì)涉及大量的內(nèi)存復(fù)制操作,如果能夠預(yù)先評(píng)估大小,可提升性能。
唯一需要注意的是: StringBuffer是線程安全的,但是StringBuilder是線程不安全的。可參看Java標(biāo)準(zhǔn)類庫(kù)的源代碼,StringBuffer類中方法定義前面都會(huì)有synchronize關(guān)鍵字。為此,StringBuffer的性能要遠(yuǎn)低于StringBuilder。
3 應(yīng)用場(chǎng)景
[A] 在字符串內(nèi)容不經(jīng)常發(fā)生變化的業(yè)務(wù)場(chǎng)景優(yōu)先使用String類。例如:常量聲明、少量的字符串拼接操作等。如果有大量的字符串內(nèi)容拼接,避免使用String與String之間的“+”操作,因?yàn)檫@樣會(huì)產(chǎn)生大量無用的中間對(duì)象,耗費(fèi)空間且執(zhí)行效率低下(新建對(duì)象、回收對(duì)象花費(fèi)大量時(shí)間)。
[B]在 頻繁進(jìn)行字符串的運(yùn)算(如拼接、替換、刪除等),并且運(yùn)行在多線程環(huán)境下,建議使用StringBuffer,例如XML解析、HTTP參數(shù)解析與封裝。
[C]在頻繁進(jìn)行字符串的運(yùn)算(如拼接、替換、刪除等),并且 運(yùn)行在單線程環(huán)境下,建議使用StringBuilder,例如SQL語句拼裝、JSON封裝等。
總結(jié)
以上是生活随笔為你收集整理的String StringBuilder StringBuffer三者之间的区别~~~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Java 多线程 —— 死锁与锁的错误用
- 下一篇: Java8————Optional
