Java StringBuffer扩容问题

2022-07-08 13:16:44

看下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

  • 作者:光头骑士
  • 原文链接:https://blog.csdn.net/guangtouwj/article/details/105517029
    更新时间:2022-07-08 13:16:44