a 的默认容量是StringBuilder
多少?
什么时候应该(或不应该)使用默认值?
StringBuilder 的默认容量是 16 个字符(我使用 .NET Reflector 来查找)。
默认值为 16,这似乎是 .NET 框架中任何类型的数组或列表的默认容量。您在 StringBuilder 上需要的重新分配次数越少越好。同时,也没有必要分配比需要更多的东西。
我通常对 StringBuilder 的最终大小进行某种粗略估计来实例化 StringBuilder。例如,这可能基于您稍后将用于构建字符串的一些迭代计数,乘以该迭代中每个项目所需的大小。
// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}
当 StringBuilder 的大小太小而无法写入下一个字符串时,StringBuilder 的内部 char 数组将重新分配为其当前大小的两倍。
这个问题今天作为另一个问题的重复出现,但我注意到其中一部分没有得到回答。正如人们所说,默认值(假设这意味着“当没有使用足够大的字符串创建时 require )是 16,但我在这里看不到任何关于何时应该更改它的内容。
当您可以更改它作为可能的优化时,您可以更改它。实际上,选择 16 与优化相反。优化是选择值和方法,以便特别适合特定情况或可能情况的子集(通常不是“让事情变得更快”,尽管我们经常使用这个词)。在这里,类的设计者必须处理泛化——选择值和方法,以便在广泛的案例中提供相当好的性能。
它们越小,内存的使用就越少。
它们越大,处理更大字符串的重新分配就越少。
在某些情况下,二进制回合(2 的整数次方)可能比其他数字提供更好的性能有几个原因,所以他们选择了其中一个,但除了在 4 或 16 或 1024 之间进行选择之外,还有一个问题平衡不同的可能值。
使用 而不是设计它的人StringBuilder
可能对他们可能需要的尺寸有更好的了解。
如果他们要5 个 1 位数字以及总长度为 43 个字符的字符串,那么无论如何Append
总长度将是 48 个字符,所以他们应该使用 48 的容量,因为 48 始终是StringBuilder
长度为 48 的字符串的最有效大小。
如果他们正在做的事情可能有大约 23 到 34 个字符之间的任何长度,他们应该使用 34。
如果他们正在做的事情可能永远不会超过 60 个字符,但偶尔可能会有,他们应该使用 64(不要为大多数部分重新分配,并获得上面提到的二的幂的好处你这样做的少数情况)。
如果无法就此得出结论,或者至少很难得出结论并且不是性能热点,那么您应该使用默认值。
可敬的 J. Skeet 对这个问题进行了很好的分析:
String-Builder 的默认容量为16 个字符,String-Builder 的最大容量为2147483647 个字符。
所以无需担心存储长响应!
我们可以使用类的容量属性找到容量StringBuilder
:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
这里容量定义了默认容量StringBuilder
。
StringBuilder
isMax Capacity
与 的最大值相同Int32
。
[编辑:当时,被问到的问题StringList
]
你的意思是StringCollection
?这最初使用一个空ArrayList
,所以答案是 0。你没有选择改变它。当你第一次添加一个项目时,容量会跳到 4,然后在它填满时使用加倍策略。
如果您的意思是List<string>
,那么它是相似的(一个空T[]
的,而不是一个ArrayList
),但是如果您需要,您可以初始化一个已知的大小(即您知道您期望多少数据)。同样,第一次Add
到 a时List<T>
,大小会跳到 4,然后每次填满时都会翻倍。
阅读有关Stringbuilder 容量的信息,也有示例应用程序可以证明这一点。