EnsureCapacity如何在Java中工作?
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());
合同规定如下 :
确保容量至少等于指定的最小值。 如果当前容量小于参数,则分配具有更大容量的新内部arrays。 新容量是更大的:
- 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)
您可能不应该使用StringBuffer
,而是使用StringBuffer
……它们都可以实现相同的基本function,但StringBuffer
是一个线程安全的同步类。 这种额外的function使得通用单线程编程的使用速度变慢。
除非你有充分的理由,否则请使用StringBuilder
而不是StringBuffer
。
至于容量, StringBuffer
(和StringBuilder
)内部都有一个char[]
数组,用于存储你追加的字符。 根据需要,此数组可以增长以包含其他字符。
当您将字母“a”附加到空StringBuffer
,长度将为1(只有一个字符),但容量将是支持数据的char[]
数组的长度,并且至少为1(实际上可能是16岁。 因此toString()
是a
, length()
是’1’,容量大约是16。
在附加数据时,容量将增加以包含更大的字符串。 扩展容量相对较慢,特别是对于大型StringBuffers
因为它们需要更大的内存分配和集合。
如果您知道数据的大小,那么您可以扩展容量来存储最终的String,而无需进行多次扩展。 这节省了时间。
因此,如果你知道一个字符串长度为1000个字符,那么你应该尽早ensureCapacity(1000)
,并节省时间。
java.lang.StringBuffer.ensureCapacity()
方法确保capacity
至少equal
指定的minimum
。
如果current capacity
less than the argument
,则分配具有greater capacity
的new internal array
。
新容量是更大的:
-
minimumCapacity
参数, - 旧容量的
Twice
加2
。
通过示例查看整个文档。
public void ensureCapacity(int minimumCapacity)
其中minimumCapacity
是minimum
所需容量。
发生什么事?
// 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` ie, 26+1 * 2 = 54 . Hence the output. System.out.println("New Capacity of buff1 = " + buff1.capacity()); //54 --> check
PS:这同样适用于第二种情况。