直接通过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=7214 15     sop(s);16 17     sop(s.capacity()); //字符串容器的容量18 19     sop(s.length()); //字符串的实际长度20 21 }