StringBuilder
的默认容量是多少?
什么时候(或不应该)使用默认容量?
StringBuilder
的默认容量是多少?
什么时候(或不应该)使用默认容量?
StringBuilder 的默认容量为 16 个字符(我使用 .NET Reflector 查找)。
默认值为16,这似乎是.NET框架中任何类型的数组或列表的默认容量。 你需要在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的大小无法写入下一个字符串时,其内部字符数组会重新分配为当前大小的两倍。
今天有人提出了这个问题,它是另一个问题的副本,但是我注意到其中一部分没有得到回答。默认值(假设这意味着“创建字符串时不需要足够大”)是16,正如其他人所说的,但我没有看到任何关于何时更改它的内容。
当您可以将其更改为可能的优化时,您应该进行更改。实际上,选择16与优化相反。优化是选择值和方法,以便特别适合特定情况或可能情况的子集,而不是通常使用该词来加速事物。在这里,类的设计者必须处理泛化,选择值和方法,以便在广泛的情况下提供合理的性能。
它们越小,使用的内存就越少。
它们越大,重新分配更大的字符串的数量就越少。
有几个原因说明二进制舍入(整数次幂)在某些情况下可能比其他数字更具优势,因此他们选择了其中一个,但除此之外,在4、16或1024之间的选择是平衡不同可能值的结果。
StringBuilder
的使用者而不是设计者,可能更清楚他们可能需要多大的尺寸。
如果他们要Append
5个一位数字以及总长度为43个字符的字符串,则StringBuilder
的总长度将始终为48个字符,因此他们应该使用容量为48的大小作为48始终是一个字符串长度48最有效的大小。
如果他们正在做某些可能会有大约23到34个字符之间的任何长度的事情,则应使用34。
如果他们正在做的事情永远不可能超过60个字符,但是每隔一段时间可能会发生这种情况,那么他们应该使用64(对于大多数部分不重新分配,并且在偶尔出现需要重新分配时获得上述二次幂的好处)。
如果无法得出结论,或者至少很难做到这一点而不是性能热点,则应该使用默认设置。
尊敬的J. Skeet先生对这个问题进行了很好的分析:
String-Builder的默认容量为16个字符,而其最大容量为2147483647个字符。
因此,不需要担心存储长响应!
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;
这里的容量定义了 StringBuilder
的默认容量。
StringBuilder
的最大容量与 Int32
的最大值相同。
[编辑:当时问题是关于 StringList
的]
你是指 StringCollection
吗?它最初使用一个空的 ArrayList
,所以答案是0。而且你没有更改它的选项。当你第一次添加一个项目时,容量会跳到4,然后在填充时使用加倍策略。
如果你指的是 List<string>
,那么它类似(一个空的 T[]
,而不是 ArrayList
),但如果需要的话,你可以初始化一个已知的大小(即你知道你期望的数据量)。同样,第一次向 List<T>
添加时,大小会跳到4,然后每次填满时都会加倍。