1. 程式人生 > >字符串之StringBuffer 與 StringBuilder的對比

字符串之StringBuffer 與 StringBuilder的對比

都是 構造 似的 .com targe 一點 增加 一句話 地址

StringBuilder 和 StringBuffer是高度類似的兩個類 StringBuilder是StringBuffer的版本改寫,下面從幾個方面簡單的對比下他們的區別 原文地址:[十四]基礎類型之StringBuffer 與 StringBuilder對比

類繼承關系

上文中,我們簡單介紹了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。

字符串之StringBuffer 與 StringBuilder的對比