列一组数据
StringBuffer sb = new StringBuffer();//原始长度即sb.length(); for(int i =0 ;i<1000;i++){ sb.append("0"); //表中缓存空间值取自sb.capacity(); }
长度、缓存空间、原始长度
首先我们得知道StringBuffer的默认初始缓存空间大小16
public StringBuffer(){ super(16); }
不同构造函数,初始缓存空间大小不同
public StringBuffer(int c){ super(c); } public StringBuffer(String str){ super(str.length()+16); append(str); }
根据不同构造函数,结合上面表格数据,就可以发现一个规律
StringBuffer的长度在大于缓存空间大小时,缓存空间会自动扩充,这个扩充大小为当前长度*2+2。第一次的扩充时间取决于初始缓存空间。
然后回过头再去看源码。
if(newCount>value.length) expandCapacity(newCount)
这句话出现在父类AbstractStringBuilder 的append中。
然后我们再来看expandCapacity(int i)
void expandCapacity(int i){ int newCapacity = (value.length+1) *2; //这句话是重点 if(newCapacity < 0 ){ newCapacity = Integer.MAX_VALUE; }else if (minimumCapacity > newCapacity){ newCapacity = i; } value = Arrays.copyOf(value,newCapacity); }
第二句的公式,就很清楚的说明了扩充规则