我在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类的构造函数和函数的基本用法。
请帮帮我。谢谢。
答案 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;