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()alength()是’1’,容量大约是16。

在附加数据时,容量将增加以包含更大的字符串。 扩展容量相对较慢,特别是对于大型StringBuffers因为它们需要更大的内存分配和集合。

如果您知道数据的大小,那么您可以扩展容量来存储最终的String,而无需进行多次扩展。 这节省了时间。

因此,如果你知道一个字符串长度为1000个字符,那么你应该尽早ensureCapacity(1000) ,并节省时间。

java.lang.StringBuffer.ensureCapacity()方法确保capacity至少equal指定的minimum

如果current capacity less than the argument ,则分配具有greater capacitynew internal array

新容量是更大的:

  1. minimumCapacity参数,
  2. 旧容量的Twice2

通过示例查看整个文档。

public void ensureCapacity(int minimumCapacity)

其中minimumCapacityminimum所需容量。

发生什么事?

 // 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:这同样适用于第二种情况。