直接通过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 }