StringBuffer buff1 = new StringBuffer("tuts point");
System.out.println("Old Capacity of buff1 = " + buff1.capacity());
buff1.ensureCapacity(28);
System.out.println("New Capacity of buff1 = " + buff1.capacity());
StringBuffer buff2 = new StringBuffer("compilejksde");
System.out.println("Old Capacity of buff2= " + buff2.capacity());
buff2.ensureCapacity(75);
System.out.println("New Capacity of buff2= " + buff2.capacity());
答案 0 :(得分:4)
确保容量至少等于指定的最小值。 如果当前容量小于参数,那么新的内部 数组分配的容量更大。新的容量是 更大的:
- minimumCapacity参数。
- 旧容量的两倍加上2.
因此,要解释程序的输出:
Old Capacity of buff1 = 26
New Capacity of buff1 = 54 // Old capacity*2+2 (since it's larger than the argument: 28)
Old Capacity of buff2= 28
New Capacity of buff2= 75 // the argument you gave, 75 (since it's larger than 2*28+2 = 58)
答案 1 :(得分:1)
您可能不应该使用StringBuffer
,而是使用StringBuilder
....它们都可以实现相同的基本功能,但StringBuffer
是一个线程安全的同步类。这种额外的功能使得它可以更慢地用于一般的单线程编程。
除非您有充分的理由,否则请使用StringBuilder
代替StringBuffer
。
对于容量,StringBuffer
(和StringBuilder
)内部都有一个char[]
数组,用于存储您追加的字符。根据需要,此数组可以增长以包含其他字符。
当您将字母“a”附加到空StringBuffer
时,长度将为1(只有一个字符),但容量将是支持数据的char[]
数组的长度,这将是至少1(实际上可能是16)。因此toString()
为a
,length()
为'1',容量约为16。
在附加数据时,容量将增加以包含更大的字符串。扩展容量相对较慢,特别是对于大StringBuffers
,因为它们需要更大的内存分配和集合。
如果您知道数据的大小,您可以扩展容量以存储最终的字符串,而无需进行多次扩展。这样可以节省时间。
所以,如果你知道一个字符串长度为1000个字符,那么你应该提前ensureCapacity(1000)
,并节省时间。
答案 2 :(得分:0)
java.lang.StringBuffer.ensureCapacity()
方法确保capacity
至少equal
到指定的minimum
。
如果current capacity
为less than the argument
,则会为new internal array
分配greater capacity
。
新容量是更大的:
minimumCapacity
参数,Twice
旧容量,加上2
。请参阅this整篇文档。
public void ensureCapacity(int minimumCapacity)
其中minimumCapacity
是minimum
所需容量。
答案 3 :(得分:0)
发生了什么事?
// initial capacity (of the array behind the scenes) will be 16.
StringBuffer buff1 = new StringBuffer("tuts point");
// The above constructor increases the capacity by 16 + stringArgument.length = 16 + 10 = 26 ( hence the output)
System.out.println("Old Capacity of buff1 = " + buff1.capacity()); // 26 ->check
buff1.ensureCapacity(28); // here 28 is minimumcapacity.
// the above line of code calls expandCapacity() of AbstractStringBuilder which does this:
//`(value.length + 1) * 2` i.e, 26+1 * 2 = 54 . Hence the output.
System.out.println("New Capacity of buff1 = " + buff1.capacity()); //54 --> check
PS:同样适用于第二种情况。