[源碼分析]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數組....
