看下StringBuffer的2个构造器和append()方法:
1、无参构造器,顺便看下父类方法,new()了一个长度为16的数组----由此可见,无参够造器默认容量是16
1
2
3
4
5
6
7
8public StringBuffer() { super(16); } // super()方法调用父类 AbstractStringBuilder(int capacity) { value = new char[capacity]; }
2、有参构造器,参数是String类型的,顺便看下父类,new()了一个长度为str.length+16的数组----由此可见,有参构造函数,初始化的容量是(str.length+16)
1
2
3
4
5
6
7
8
9public StringBuffer(String str) { super(str.length() + 16); append(str); } // 同样super()调用父类 AbstractStringBuilder(int capacity) { value = new char[capacity]; }
3、当我们调用append()方法的时候,一直向上找到父类的expandCapacity()方法
1
2
3
4
5
6
7
8
9
10
11void 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内容请搜索靠谱客的其他文章。
发表评论 取消回复