[十四]基礎類型之StringBuffer 與 StringBuilder對比


StringBuilder 和 StringBuffer是高度類似的兩個類
StringBuilder是StringBuffer的版本改寫,下面從幾個方面簡單的對比下他們的區別

類繼承關系

上文中,我們簡單介紹了AbstractStringBuilder
他是可變的字符序列的抽象模型,定義了可變字符序列的公共行為
它是一個抽象類,針對一些操作提供了默認的實現
StringBuilder 和 StringBuffer 都是可變字符序列
所以他們都實現了AbstractStringBuilder
image_5bd264bb_7d96
 

方法體系

 
他們除了實現了AbstractStringBuilder  和 CharSequence外
實際上他們沒有自己的方法
所有的方法都來自AbstractStringBuilder  和 CharSequence
 
image_5bd264bc_328c
從上圖看得出來,構造方法的方法簽名----方法參數的個數和類型都是一樣的
其實, 他們就是一樣的,初始容量等
image_5bd264bc_22ea
 

線程安全

 
StringBuffer是線程安全的
StringBuilder是非線程安全的
 
其實線程安全也就是方法前面增加了一個synchronized關鍵字
比如下面的幾個方法

 

toStringCache

StringBuffer中有一個toStringCache 就像它的名字一樣,toString()方法的cache
簡言之就是緩存toString方法
每次調用toString會檢查這個字段,如果不為null將會使用它進行對象創建
如果為null  將會給他初始化賦值,也就是緩存
當調用其他的任何方法改變StringBuffer時,就會把toStringCache進行清空
比如下面截圖方法setCharAt append
如果每次都是更改變動后調用,顯然,還適得其反的浪費了性能
如果多次調用toString將會得到好處
image_5bd264bc_4681

總結

兩個類的功能邏輯上來說基本一樣,都是可變的字符序列
代碼的相似度也很高
他們本身就是為了做同一件事情
只不過是各自的側重點不同
他們都實現了AbstractStringBuilder和CharSequence
他們的方法都來自於這兩個類
只不過StringBuffer是線程安全的,StringBuilder非線程安全
其實 早在1.0版本StringBuffer 就已經存在了
StringBuffer則是在1.5才加入進來的,AbstractStringBuilder 也是在1.5加入進來
StringBuilder  就是 StringBuffer的一個非線程安全的實現
AbstractStringBuilder 也是后來才對類的設計進行抽象升華的
StringBuffer才實現了這個類
 
他們的源代碼也大多數是雷同的
主要差異就在於以下三點
StringBuffer覆蓋的方法略微多一點
StringBuffer 在方法上增加了synchronized關鍵字用於同步,亦或者應該說,StringBuilder去掉了synchronized
StringBuffer的toStringCache緩存
如果去掉這三點,這兩份代碼就幾乎是一樣的了
 
除非你的確非常確信你需要使用StringBuffer
否則,如果不可變使用String 
如果可變使用StringBuilder ,盡可能的放棄StringBuffer 吧
 
總結起來就一句話
StringBuilder是StringBuffer的非同步版本就是版本改寫
能用StringBuilder就不要用StringBuffer。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM