java capacity_关于Java中StringBuffer的capacity问题
從API查到capacity的作用是查看StringBuffer的容器容量是多少,剛開始納悶這個(gè)跟length的區(qū)別在哪?試驗(yàn)了幾次感覺有點(diǎn)不解。所以直接跟進(jìn)源碼分析。
直接通過new StringBuffer(String str);時(shí),capacity是str.length+16,從源碼可知:
如果直接是new StringBuffer(),則capacity為16,見下圖:
如果小于16則默認(rèn)容器的大小為16。如果大于16則會(huì)調(diào)用expandCapacity 函數(shù)進(jìn)行容量的擴(kuò)展。
由源碼可以看到擴(kuò)展的規(guī)則是把舊的容量(value的長(zhǎng)度)*2+2,然后與現(xiàn)有的比較,如果小于則把現(xiàn)有的容量當(dāng)做新的,如果大于則用新得到的容量。
所以第一次append時(shí),小于16則不需擴(kuò)展,如果大于16則會(huì)直接擴(kuò)展到34(16*2+2),比較得到大于append后的長(zhǎng)度的話則用34,如果不 是則用append后的長(zhǎng)度。
此時(shí)capacity的大小等于append后的長(zhǎng)度,如果在append的話,若不超過70(34*2+2)的話,此時(shí)則capacity為70,如果超過70則繼續(xù)用第二次append后的總長(zhǎng)度。
實(shí)驗(yàn)源碼:
1 public static voidmain(String[] args) {2
3 //StringBuffer的初始容量為16個(gè)字節(jié)長(zhǎng)度。
4
5 StringBuffer s = newStringBuffer();6
7 s.append("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");8
9 //超過16不超過34則用34,超過34則用append后的長(zhǎng)度
10
11 s.append("a");12
13 //若上面append剛好超過34,為35,則capacity為35,但是若append一個(gè)字節(jié),則為35*2+2=72
14
15 sop(s);16
17 sop(s.capacity()); //字符串容器的容量
18
19 sop(s.length()); //字符串的實(shí)際長(zhǎng)度
20
21 }
總結(jié)
以上是生活随笔為你收集整理的java capacity_关于Java中StringBuffer的capacity问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人民银行70周年纪念币
- 下一篇: java数组空指针一场_Java使用自定