[十四]基礎類型之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。
相關文章
相關標籤/搜索