为什么我们需要StringBuilder中的容量

时间:2014-12-19 08:12:15

标签: java stringbuilder

众所周知,StringBuilder中有一个名为capacity的属性,它总是大于StringBuilder对象的长度。但是,用于什么容量?如果长度大于容量,它将被扩展。如果它做了什么,有人可以举个例子吗?

4 个答案:

答案 0 :(得分:9)

您可以使用初始容量来节省在追加StringBuilder时重新调整大小的需要,这需要花费时间。

如果您知道提前将多少字符附加到StringBuilder并在创建StringBuilder时指定该大小,则在使用时不必重新调整大小

另一方面,如果您没有提供初始容量,或者提供的初始容量太小,则每次达到此容量时,都必须增加StringBuilder的存储空间,这涉及将存储在原始存储器中的数据复制到更大的存储器中。

答案 1 :(得分:3)

字符串构建器必须存储正在某处构建的字符串。它在一个字符数组中这样做。容量是此数组的长度。一旦数组溢出,就会分配一个新的(更长的)数组,并将内容传输给它。这使得容量上升。

如果您不关心性能,只需忽略容量即可。一旦你要构建巨大的字符串并提前知道它们的大小,容量可能会变得有趣。然后,您可以请求容量等于预期大小的字符串构建器(如果您不确定大小,则可以稍大一些)。

构建内容大小为100万的字符串时的示例:

StringBuilder sb = new StringBuilder(1000000);
for(int i = 0; i < 1000000; i++){
   sb.append("x");
}

与一个必须重复复制其数组的默认字符串构建器相比,使用一百万字符串初始化字符串构建器会使其更快。

答案 2 :(得分:2)

StringBuilder支持由一系列字符组成。默认容量为16 + String参数的长度。如果附加到StringBuilder并且字符数不能适合数组,则必须更改容量,这将花费时间。因此,如果您对可能拥有的字符数有所了解,初始化容量

答案 3 :(得分:0)

答案是:效果。正如其他答案已经说过的,StringBuilder使用一些原始大小(容量)的内部数组。每次构建字符串变大以使数组保持它时,StringBuilder必须分配一个新的更大的数组,将前一个数组中的数据复制到新数组并删除前一个数组。

如果您事先知道结果字符串的大小,并将该信息传递给构造函数,StringBuilder可以立即创建足够大的数组,从而避免分配和复制。

虽然对于小字符串而言,性能提升是可以获得的,但如果构建非常大的字符串,则会产生很大的不同。