天天看點

JDK源碼閱讀(3):AbstractStringBuilder、StringBuffer、StringBuilder類閱讀筆記

JDK源碼閱讀(3):AbstractStringBuilder、StringBuffer、StringBuilder類閱讀筆記

JDK源碼閱讀:AbstractStringBuilder、StringBuffer、StringBuilder類閱讀筆記

<code>inflate()</code>方法可以将目前的Latin1編碼的字元串膨脹到16位,即UTF16編碼(Latin1編碼為8位)

<code>ensureCapacity(miniCapacity)</code>方法保證目前容器的大小不小于<code>miniCapacity</code>,如果小于的話就要進行擴容處理。擴容成下面兩者中的較大值。

miniCapacity

2*oldCapacity

<code>setCharAt()</code>方法可以将index處的字元設為ch

<code>append()</code>方法根據參數類型不同,在字元串後面追加。

值得一提的是這個<code>appendNull()</code>方法,當我們在試圖append一個空對象時,它居然選擇在builder串後面加上一個“null”,看下面的示例。

輸出結果居然是

也就是說,當append空對象時,會append一個“null”字元串。

另外,當我們嘗試append一個boolean對象時,會append一個“true”串或者“false”串。

<code>delete</code>方法删除builder中的一段

類似地還有<code>deleteCharAt</code>

<code>reverse()</code>方法可以逆轉字元的順序。

實際的方法就是雙指針靠攏+交換、

<code>StringBuffer</code>類幾乎所有方法都是通過<code>super</code>關鍵字調用<code>AbstractStringBuilder</code>父類的方法。

<code>StringBuffer</code>實作同步的方式就是給所有方法加上<code>synchronized</code>關鍵字。

<code>toStringCache</code>緩存了<code>toString()</code>方法的最後一次調用的值,在每次StringBuffer被修改前這個緩存會清除。

<code>toString()</code>方法中檢查如果有緩存,就直接傳回緩存。這樣不用每次都處理<code>toString()</code>的過程,而隻在需要的時候處理。

<code>StringBuilder</code>類幾乎所有方法都是通過<code>super</code>關鍵字調用<code>AbstractStringBuilder</code>父類的方法。