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