StringBuffer是繼承自AbstractStringBuilder的.html
這裏附上另外兩篇文章的鏈接:數組
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裏的同樣. 不過仍是再貼出來吧.ui
無參構造器是默認的大小爲16.this
或者能夠直接給定大小. 來規定初始化時的數組大小.spa
若是是根據傳入字符串來構造的, 那麼初始大小就是: 傳入的字符串長度+16.線程
以reverse爲例吧.htm
1. 經常使用的方法基本都是調用的父類的
2. 方法聲明上多了synchronized修飾符
3. 多了一行toStringCache = null. (這個下面待會兒再講)
4. return this是和StringBuilder同樣的, 都有這段代碼.
咱們打開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數組....