關於Java中StringBuffer的capacity問題


從API查到capacity的作用是查看StringBuffer的容器容量是多少,剛開始納悶這個跟length的區別在哪?試驗了幾次感覺有點不解。所以直接跟進源碼分析。

直接通過new StringBuffer(String str);時,capacity是str.length+16,從源碼可知:

如果直接是new StringBuffer(),則capacity為16,見下圖:

如果小於16則默認容器的大小為16。如果大於16則會調用expandCapacity 函數進行容量的擴展。

由源碼可以看到擴展的規則是把舊的容量(value的長度)*2+2,然后與現有的比較,如果小於則把現有的容量當做新的,如果大於則用新得到的容量。

所以第一次append時,小於16則不需擴展,如果大於16則會直接擴展到34(16*2+2),比較得到大於append后的長度的話則用34,如果不 是則用append后的長度。

此時capacity的大小等於append后的長度,如果在append的話,若不超過70(34*2+2)的話,此時則capacity為70,如果超過70則繼續用第二次append后的總長度。

實驗源碼:

 1 public static void main(String[] args) {
 2 
 3     //StringBuffer的初始容量為16個字節長度。
 4 
 5     StringBuffer s = new StringBuffer();
 6 
 7     s.append("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
 8 
 9     //超過16不超過34則用34,超過34則用append后的長度
10 
11     s.append("a");
12 
13     //若上面append剛好超過34,為35,則capacity為35,但是若append一個字節,則為35*2+2=72
14 
15     sop(s);
16 
17     sop(s.capacity()); //字符串容器的容量
18 
19     sop(s.length()); //字符串的實際長度
20 
21 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM