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