[源碼分析]StringBuffer

[源碼分析]StringBuffer

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同樣的, 都有這段代碼.

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數組....

相關文章
相關標籤/搜索