EnsureCapacity如何在Java中工作?

时间:2014-09-29 10:58:31

标签: java stringbuffer

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());

4 个答案:

答案 0 :(得分:4)

合同states the following

  

确保容量至少等于指定的最小值。   如果当前容量小于参数,那么新的内部   数组分配的容量更大。新的容量是   更大的:

     
      
  • 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()alength()为'1',容量约为16。

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

如果您知道数据的大小,您可以扩展容量以存储最终的字符串,而无需进行多次扩展。这样可以节省时间。

所以,如果你知道一个字符串长度为1000个字符,那么你应该提前ensureCapacity(1000),并节省时间。

答案 2 :(得分:0)

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

如果current capacityless than the argument,则会为new internal array分配greater capacity

新容量是更大的:

  1. minimumCapacity参数,
  2. Twice旧容量,加上2
  3. 请参阅this整篇文档。

    public void ensureCapacity(int minimumCapacity)

    其中minimumCapacityminimum所需容量。

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