概述
看下StringBuffer的2个构造器和append()方法:
1、无参构造器,顺便看下父类方法,new()了一个长度为16的数组----由此可见,无参够造器默认容量是16
public StringBuffer() {
super(16);
}
// super()方法调用父类
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
2、有参构造器,参数是String类型的,顺便看下父类,new()了一个长度为str.length+16的数组----由此可见,有参构造函数,初始化的容量是(str.length+16)
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
// 同样super()调用父类
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
3、当我们调用append()方法的时候,一直向上找到父类的expandCapacity()方法
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
可以看出,当我们append的时候,如果当前容量够用,则不扩容,如果当前容量不够用了,则需要扩容,扩容的机制是,①当前容量 * 2 +2 , ②见下面第二个测试的解释
解释:
19 = 16 + 3 默认容量 16 ,"123"的长度3
16 默认容量
16 当前容量16够用,不需要扩容
34 = 16 * 2 + 2 当前容量不够用了,需要扩容
70 = 34* 2 + 2 当前容量不够用了,需要扩容
142 = 70* 2 + 2 当前容量不够用了,需要扩容
特殊情况,解释:
16 默认的容量
40 = sb2.length 这里需要注意下,如果这个时候 原容量 *2 + 2 < sb2.length ,会把当前容量设置成sb2.length,参见父类方法里的 ( if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity;) 这个地方
82 = 40 * 2 + 2
166 = 82 *2 + 2
最后
以上就是笨笨板凳为你收集整理的Java StringBuffer扩容问题的全部内容,希望文章能够帮你解决Java StringBuffer扩容问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复