更加詳細的內容可以查看https://blog.csdn.net/u011702479/article/details/82262823
String
字符串廣泛應用 在Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來創建和操作字符串。
需要注意的是,String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,這樣不僅效率低下,而且大量浪費有限的內存空間。
StringBuffer 和 StringBuilder
爲了應對經常性的字符串相關的操作,谷歌引入了兩個新的類——StringBuffer類和StringBuild類來對此種變化字符串進行處理。StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。
StringBuffer 源代碼淺析
StringBuffer 繼承了AbstractStringBuilder這個類,當我們在main中創建一個StringBuffer 對象時,StringBuffer 的構造方法會調用它的父類:
StringBuffer 的構造方法
而它的父類則創建了一個,char類型的數組,構造方法中傳入了要創建的數組的長度。
但是查看源代碼就可以發現,StringBuffer一共有四個構造方法,每個構造方法以不同的方式配置了即將創建的char類型數組的長度,如下所示:
從上圖可以發現,各個構造方法以不同的方式設置了數組的長度:
- 第一個構造函數設置了StringBuffer的默認長度也就是16
- 第二個構造方法要求傳入char類型數組的長度
- 第三個構造方法以字符串的長度再加上16爲數組的長度
- 第四個則是調用了CharSequence這個類,這個類的作用網上說是一組字符序列,暫時可以理解爲和String一樣可以定義字符串的一個對象,通過這個類獲取到定義的字符串的長度加16爲即將創建的數組的長度,然後調用append進行追加。
常用方法解析
StringBuffer的append方法
在此之前首先必須瞭解一下toStringCache,個人理解,這個toStringCache字段是爲了作緩存的 緩存最後一次toString的內容. 當被修改的時候這個cache清空. 也就是說, 如果沒被修改, 那麼這個toStringCache就是上一次toString的結果.
沒被修改的時候, 就可以直接把toStringCache作爲new String的參數. 然後把這個String返回就行了.
也就是cache有效的時候, 就不必進行arraycopy的複製操作. cache失效了才進行arraycopy的複製操作.
StringBuffer的append方法是用來追加字符串的,java對該方法進行了不斷的重寫,共十一個方法
方法一,傳入Object對象
從上圖可以看出append方法首先清除,