淺談StringBuffer構造方法及擴容

目錄

  1. StringBuffer的構造方法
  2. StringBuffer的擴容

StringBuffer的構造方法

這是StringBuffer的類圖,StringBuffer繼承AbstractStringBuilder。StringBuffer中的構造方法都調用了其父類的構造方法,因此在瞭解StringBuffer的構造方法前有必要了解一下它們倆的成員變量。

以上是AbstractStringBuilder的三個成員變量,value用來存儲字符,count代表使用的字符數;MAX_ARRAY_SIZE是最大的分配容量,即2^31-9,若想分配超過這個數字的容量將會報OutOfMemoryError的錯誤:請求的數組大小超過VM限制。

以上的StringBuffer的一個成員變量,toString方法將會返回它最後的值,當StringBuffer被修改時它將會被清空。

StringBuffer類可以創建可修改的字符串序列。該類有StringBuffer(),StringBuffer(int size),StringBuffer(String s),StringBuffer(CharSequence seq)構造方法。

1.StringBuffer()的初始容量可以容納16個字符,當該對象的實體存放的字符的長度大於16時,實體容量就自動增加。StringBuffer對象可以通過length()方法獲取實體中存放的字符序列長度,通過capacity()方法來獲取當前實體的實際容量。

2.StringBuffer(int size)可以指定分配給該對象的實體的初始容量參數爲參數size指定的字符個數。當該對象的實體存放的字符序列的長度大於size個字符時,實體的容量就自動的增加。以便存放所增加的字符。

3.StringBuffer(String s)可以指定給對象的實體的初始容量爲參數字符串s的長度額外再加16個字符。當該對象的實體存放的字符序列長度大於size個字符時,實體的容量自動的增加,以便存放所增加的字符。

4.StringBuffer(CharSequence seq)當傳入一個CharSequence變量時,會調用StringBuffer(int capacity)方法,初始大小爲seq的長度加16,同時初始內容爲seq的StringBuffer對象。

 

StringBuffer的擴容

擴容策略(2*n + 2):

StringBuffer在內部維護一個字符數組,當你使用缺省的構造函數來創建StringBuffer對象的時候,因爲沒有設置初始化字符長度,StringBuffer的容量被初始化爲16個字符,也就是說缺省容量就是16個字符。
當StringBuffer達到最大容量的時候,它會將自身容量增加到當前的2倍再加2,也就是(2舊值+2)。
如果你使用缺省值,初始化之後接着往裏面追加字符,在你追加到第16個字符的時候它會將容量增加到34(2*16+2),當追加到34個字符的時候就會將容量增加到70(2*34+2)。

擴容源碼:

StringBuffer和StringBuilder類都繼承了抽象類AbstractStringBuilder類;源碼都調用父類來進行初始化:

 StringBuffer(String s)的初始化:

擴容算法:

使用append()方法在字符串後面追加東西的時候,如果長度超過了該字符串存儲空間大小了就需要進行擴容:構建新的存儲空間更大的字符串,將久的複製過去;
 
再進行字符串append添加的時候,會先計算添加後字符串大小,傳入一個方法:ensureCapacityInternal 這個方法進行是否擴容的判斷,需要擴容就調用expandCapacity方法進行擴容:


嘗試將新容量擴爲大小變成2倍+2   if 判斷一下 容量如果不夠,直接擴充到需要的容量大小。

 

 

作者:Roger_CoderLife

鏈接:https://blog.csdn.net/Roger_CoderLife/article/details/95179792

本文爲Roger_CoderLife的原創文章,著作權歸作者所有,轉載請註明原文出處,歡迎轉載!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章