Java 核心之StringBuffer和StringBuilder 的講解

上面這幅圖,描述了StringBuffer和StringBuilder的繼承關係圖。

(1)StringBuilder代碼講解

從上面StringBuilder的構造函數中,我們可以看見StringBuilder直接調用父類(AbstractStringBuilder)的構造函數,我們再看看AbstractStringBuilder的構造函數:

從AbstractStringBuilder的構造函數中,我們可以看出StringBuilder中存儲字符串其實用的是一個char數組,capacity其實就是指定這個char數組的大小。
下面從StringBuilder中的append函數中看看其他具體的實現是如何實現的:

又是直接調用父類(AbstractStringBuilder)的append方法,再跟到父類中去看看。

上面的邏輯還是比較簡單的,在append(str)函數調用的時候,首先會判斷原來用於存儲字符串的values的字符串數組有沒有足夠的大小來存儲將要新添加入StringBuilder的字符串。如果不夠用,那麼就調用expandCapacity(int minimumCapacity)讓容量翻兩倍(一般是擴大兩倍,特殊情況見代碼),如果夠用,那麼就直接添加進去。

      

2 ) StringBuffer代碼實現

      StringBuffer的構造函數和和實現原理基本和StringBuilder類似,唯一不一樣的地方在於append函數的實現:


很顯然,這個函數前面添加了一個synchronized標識符,也就是說StringBuffer中的append函數是線程安全的,通過繼續查閱其他StringBuffer中的函數,我們也可以發現他們有synchronized標識符,這就不難理解爲什麼StringBuffer是線程安全的,但是很明顯加上線程控制會拖慢程序運行的速度,所以如果不需要線程控制,那麼最好就用StringBuilder。另外,StringBuffer和StringBuilder的實現使用了建造者模式來實現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章