StringBuffer 的容量是如何增加的?
How does the capacity of a StringBuffer increase?
我在 Java 中尝试了 StringBuffer class 的构造函数,但我对 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 class 的构造函数和函数的基本用法。
请帮帮我。谢谢。
请参考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;
对于secondblock,初始value.length
= 10, and (value.length << 1) + 2
= 22;
我在 Java 中尝试了 StringBuffer class 的构造函数,但我对 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 class 的构造函数和函数的基本用法。
请帮帮我。谢谢。
请参考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;
对于secondblock,初始value.length
= 10, and (value.length << 1) + 2
= 22;