我是靠谱客的博主 笨笨板凳,这篇文章主要介绍Java StringBuffer扩容问题,现在分享给大家,希望可以做个参考。

看下StringBuffer的2个构造器和append()方法:

1、无参构造器,顺便看下父类方法,new()了一个长度为16的数组----由此可见,无参够造器默认容量是16

复制代码
1
2
3
4
5
6
7
8
public 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
9
public 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
11
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部