1、请看一下程序段:
//初始化一个StringBuffer对象并设置容量为3
StringBuffer strBuf1=new StringBuffer(3);
String addStr="1234";//添加字符串
//打印原始容量
System.out.println("原始容量为:"+strBuf1.capacity());
//添加一个长度为 4 的字符串到strBuf中
strBuf1.append(addStr);
/**
* 由于我们初始化的strBuf对象的容量为3,而添加的数据长度为4,
* 所以此处就会自动扩充容量,那么自动扩充后的容量值是多少呢?
* 是4吗?
*/
System.out.println("添加字符串"+addStr+"后容量为:"+strBuf1.capacity());
输出结果:
显然输出结果显示自动扩充后容量为:8,而非我们猜想的4。这是为什么?
2、将添加内容长度变为5后再次测试
String addStr="12345";//添加字符串
输出结果:
测试结果可知容量依旧还是扩充为8
3、下面我们依次将容量增加1进行多次测试
由以上结果可知,在添加的字符串长度(addStr.length)3<addStr.length<=8的时候,自动扩充的容量都为8,也就是原始容量3的2倍还多2;
4、那如果我们把字符串长度增加到9呢?容量会扩充到多少?我们看下面的测试结果
经过分析以上测试结果我们可知:
1)当添加的字符串长度大于3,并且小于等于8的时候,扩充后的容量都是8
公式表示:初始容量<添加字符串长度<=(初始容量*2+2 )成立时,
扩充容量=初始容量*2+2
2)当添加的字符串长度大于8时,扩充后的容量就是当前添加的字符串长度
公式表示:添加字符串长度>(初始容量*2+2)成立时,
扩充容量=添加字符串长度
方便理解我们使用if语句表示就是
/*
addStr.length=添加字符串长度
startCapatity=初始容量
extendCapacity=扩充容量
*/
if((startCapatity<addStr.length)&&(addStr.length<=(addStr.length*2+2)){
//如果[添加的字符串长度]大于[初始容量],并且小于等于[初始容量*2+2]
//那么容量就会扩充为[初始容量*2+2]
}else if(addStr.length>(startCapatity*2+2)){
//如果[添加字符串长度]大于[初始容量*2+2]
//那么容量就会扩充为[添加字符串长度]
}
5、验证
下面我们将代码初始容量修改为5,添加字符串长度修改为8后测试结果
根据公式可知容量应该为5*2+2=12
结果显示计算正确,所以也验证了公式的正确
然后再将字符串长度修改为15后测试结果
字符串长度15>5*2+2,所以容量会自动扩展为15
结论总结
如果初始容量无法容纳,那么容量将会扩充为2倍+2;如果容量还是不够,那么会直接扩充到所需容量