StringBuffer的容量如何增加?

时间:2018-01-09 09:12:48

标签: java stringbuffer

我在Java中尝试了StringBuffer类的构造函数,但我对StringBuffer(int initial )构造函数的工作感到困惑。

我知道它为缓冲区提供了初始容量,但我怀疑,当提供的初始容量实际上小于对象的长度时,在这种情况下容量如何增加?

我在第一个案例中尝试了两个案例:

StringBuffer str = new StringBuffer(11);
str.append("Hello World!");
System.out.println(str.length() + " " + str.capacity()); //prints 12 24

容量变为 两倍于字符串长度

并在第二个:

StringBuffer str = new StringBuffer(10);
str.append("Hello World!");
System.out.println(str.length() + " " + str.capacity()); //prints 12 22

即容量变为 长度+初始缓冲容量

那么为什么这种不同的缓冲区大小增加。在这两种情况下,初始容量都小于字符串长度,因此它应该在两种情况下都变为24的长度加倍,或者它加到初始缓冲区,在第一种情况下变为23,在第二种情况下变为22第二。我也阅读了文档和各种其他博客,但我能找到的只是StringBuffer类的构造函数和函数的基本用法。

请帮帮我。谢谢。

1 个答案:

答案 0 :(得分:4)

请参阅StringBuffer和AbstractStringBuilder的源代码:

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

请仔细阅读这些代码

对于第一个块,初始value.length = 11,(value.length << 1) + 2 = 24; 对于第二个块,初始value.length = 10,(value.length << 1) + 2 = 22;