Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EnsureCapity在Java中是如何工作的?_Java_Stringbuffer - Fatal编程技术网

EnsureCapity在Java中是如何工作的?

EnsureCapity在Java中是如何工作的?,java,stringbuffer,Java,Stringbuffer,合同: 确保容量至少等于指定的最小值。 如果当前容量小于参数,则会生成一个新的内部 阵列分配了更大的容量。新的容量是 较大者: 最小容量参数 旧容量的两倍,加上2 因此,要解释程序的输出: StringBuffer buff1 = new StringBuffer("tuts point"); System.out.println("Old Capacity of buff1 = " + buff1.capacity()); buff1.ensureCapacity(28); System

合同:

确保容量至少等于指定的最小值。 如果当前容量小于参数,则会生成一个新的内部 阵列分配了更大的容量。新的容量是 较大者:

  • 最小容量参数
  • 旧容量的两倍,加上2
因此,要解释程序的输出:

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

java.lang.StringBuffer.ensureCapacity()
方法确保
容量至少等于指定的
最小值

如果
当前容量
小于参数
,则为
新的内部数组
分配
更大的容量

新容量为以下两项中的较大者:

  • minimumCapacity
    参数
  • 两次
    旧容量,再加上
    2
  • 请参阅完整的文档和示例

    公共空间容量(int最小容量)


    其中
    minimumCapacity
    所需的最小容量。

    您可能不应该使用
    StringBuffer
    ,而应该使用
    StringBuilder
    。。。。它们都实现了相同的基本功能,但是
    StringBuffer
    是一个线程安全的同步类。这种额外的功能使得它在一般的单线程编程中使用的速度变慢

    除非有充分的理由,否则请使用
    StringBuilder
    而不是
    StringBuffer

    至于容量,
    StringBuffer
    (和
    StringBuilder
    )在内部都有一个
    char[]
    数组,用于存储附加的字符。此数组可以根据需要增长以包含其他字符

    当您将字母“a”附加到空的
    StringBuffer
    时,长度将为1(仅一个字符),但容量将是备份数据的
    char[]
    数组的长度,并且至少为1(实际上可能为16)。因此
    toString()
    a
    length()
    为“1”,容量约为16

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

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

    因此,如果您知道一个字符串将有1000个字符长,那么您应该尽早确保Recapacity(1000)
    ,并在以后节省时间。

    发生了什么

    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)
    

    PS:这同样适用于第二种情况。

    您想做什么?程序的结果是旧容量buff1=26,新容量buff1=54,旧容量buff2=28,新容量buff2=75。我想知道,为什么从任何角度来看,两个缓冲区的结果都不匹配User3145373ツ 请解释ensureCapacity()方法的工作过程源代码包含在JDK中。你可以自己看看它是如何工作的。你知道为什么它不仅加倍了,而且还增加了一个2。好问题。也许这是一个简单的技巧,可以避免尝试将0长度数组的大小增加一倍。如果你发现了,请告诉我
    AbstractStringBuilder
    具有默认构造函数。但无论是
    StringBuilder
    还是
    StringBuffer
    都不使用该选项。他们使用一个具有初始容量的。因此,在这种情况下,对于这两个数组,不会有0长度的数组。它们的默认大小为16。您知道
    AbstractStringBuilder
    的任何其他用例吗?您在哪里找到
    (value.length+1)*2
    。从
    AbstractStringBuilder
    类实现?
    // 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