從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 }