我是靠谱客的博主 笨笨板凳,最近开发中收集的这篇文章主要介绍Java StringBuffer扩容问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

看下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扩容问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部