[源碼分析]StringBuffer


[源碼分析]StringBuffer

StringBuffer是繼承自AbstractStringBuilder的.

這里附上另外兩篇文章的連接:

AbstractStringBuilder : http://www.cnblogs.com/noKing/p/9427967.html 

StringBuilder : http://www.cnblogs.com/noKing/p/jdk8_StringBuilder.html

構造器

我每篇文章都說. 請忽略我的"My". 我copy了jdk的代碼, 然后把StringBuffer改為了MyStringBuffer. 核心源碼不會改動的.

 

構造器和StringBuilder里的一樣. 不過還是再貼出來吧.

無參構造器是默認的大小為16.

 

或者可以直接給定大小. 來規定初始化時的數組大小.

 

如果是根據傳入字符串來構造的, 那么初始大小就是: 傳入的字符串長度+16.

其他常用方法

以reverse為例吧.

1. 常用的方法基本都是調用的父類的

2. 方法聲明上多了synchronized修飾符

3. 多了一行toStringCache = null. (這個下面待會兒再講)

4. return this是和StringBuilder一樣的, 都有這段代碼.

toString方法

我們打開StringBuffer源碼, 第一眼就可以看到這個字段

英文注釋也說得很清楚. 這個toStringCache字段是為了作緩存的.

緩存什么呢? 緩存最后一次toString的內容. 當被修改的時候這個cache清空. 

也就是說, 如果沒被修改, 那么這個toStringCache就是上一次toString的結果.

沒被修改的時候, 就可以直接把toStringCache作為new String的參數. 然后把這個String返回就行了. 

也就是cache有效的時候, 就不必進行arraycopy的復制操作. cache失效了才進行arraycopy的復制操作.

Stack Overflow 里也有這個問題 Why StringBuffer has a toStringCache while StringBuilder not?

toString方法代碼如下:

里面的String構造器的源碼如下:

總結

1. 構造的大小和16相關. 要么是16, 要么就是加16.(除非使用了定制數組大小的那個構造器, 也就是 本文中截圖的第二個構造器. 那么就是指定多大, 初始數組就是多大了.)

2. 實現了toString方法. 內部實現就是每次toString都是new一個String對象.

3. 其他方法都是調用的父類的方法. 只是多加了一行return this;

4. 方法上加了synchronized修飾符來保證線程安全.

5. 有一個我覺得沒什么作用的toStringCache數組....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM