我们知道,StringBuilder中有一个属性叫capacity,它总是大于StringBuilder对象的长度。然而,容量是用来做什么的呢?如果长度大于容量,则会进行扩展。如果它确实起作用,有人可以举个例子吗?
您可以使用初始容量来节省在追加时重新调整
StringBuilder
大小的需要,这会花费时间。
如果您提前知道将添加多少个字符到
StringBuilder
并在创建 StringBuilder
时指定该大小,则在使用时永远不需要重新调整大小。
另一方面,如果您没有给出初始容量,或者给出的初始容量太小,则每次达到该容量时,都必须增加
StringBuilder
的存储空间,这涉及到复制存储的数据在原来的存储到更大的存储。
字符串构建器必须将正在构建的字符串存储在某处。它在字符数组中执行此操作。容量就是这个数组的长度。一旦数组溢出,就会分配一个新的(更长的)数组并将内容传输到其中。这使得容量上升。
如果您不关心性能,请忽略容量。一旦您要构造巨大的字符串并预先知道它们的大小,容量可能会变得有趣。然后,您可以请求一个容量等于预期大小的字符串生成器(如果您不确定大小,则可以稍大一些)。
构建内容大小为 100 万的字符串的示例:
StringBuilder sb = new StringBuilder(1000000);
for(int i = 0; i < 1000000; i++){
sb.append("x");
}
与必须重复复制其数组的默认字符串生成器相比,用一百万初始化字符串生成器将使其速度更快。
StringBuilder
由字符数组支持。默认容量是 16
+ String 参数的长度。如果您追加到 StringBuilder 并且数组无法容纳字符数,则必须更改容量,这将需要时间。因此,如果您对可能拥有的字符数有所了解,请初始化容量。
答案是:性能。正如其他答案已经说过的那样,StringBuilder 使用某个原始大小(容量)的内部数组。每当构建的字符串变得很大以至于数组无法容纳它时,StringBuilder 就必须分配一个新的、更大的数组,将数据从前一个数组复制到新数组并删除前一个数组。
如果您事先知道结果字符串的大小并将该信息传递给构造函数,StringBuilder 可以立即创建一个足够大的数组,从而可以避免分配和复制。
虽然对于小字符串,性能增益可以忽略不计,但如果您构建非常大的字符串,则会产生很大的差异。