StringBuilder 和 StringBuffer是高度相似的兩個類
StringBuilder是StringBuffer的版本改寫,下面從幾個方面簡單的對比下他們的區別
類繼承關係
上文中,咱們簡單介紹了AbstractStringBuilder
他是可變的字符序列的抽象模型,定義了可變字符序列的公共行爲
它是一個抽象類,針對一些操做提供了默認的實現
StringBuilder 和 StringBuffer 都是可變字符序列
因此他們都實現了AbstractStringBuilder
方法體系
他們除了實現了AbstractStringBuilder 和 CharSequence外
實際上他們沒有本身的方法
全部的方法都來自AbstractStringBuilder 和 CharSequence
從上圖看得出來,構造方法的方法簽名----方法參數的個數和類型都是同樣的
其實, 他們就是同樣的,初始容量等
線程安全
StringBuffer是線程安全的
StringBuilder是非線程安全的
其實線程安全也就是方法前面增長了一個synchronized關鍵字
好比下面的幾個方法
toStringCache
StringBuffer中有一個toStringCache 就像它的名字同樣,toString()方法的cache
簡言之就是緩存toString方法的
每次調用toString會檢查這個字段,若是不爲null將會使用它進行對象建立
若是爲null 將會給他初始化賦值,也就是緩存
當調用其餘的任何方法改變StringBuffer時,就會把toStringCache進行清空
好比下面截圖方法setCharAt append
若是每次都是更改變更後調用,顯然,還拔苗助長的浪費了性能
若是屢次調用toString將會獲得好處
總結
兩個類的功能邏輯上來講基本同樣,都是可變的字符序列
代碼的類似度也很高
他們自己就是爲了作同一件事情
只不過是各自的側重點不一樣
他們都實現了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。