StringBuilder 的默认容量是多少?

38

StringBuilder 的默认容量是多少?

什么时候(或不应该)使用默认容量?

8个回答

50

StringBuilder 的默认容量为 16 个字符(我使用 .NET Reflector 查找)。


37

默认值为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的大小无法写入下一个字符串时,其内部字符数组会重新分配为当前大小的两倍。


15

今天有人提出了这个问题,它是另一个问题的副本,但是我注意到其中一部分没有得到回答。默认值(假设这意味着“创建字符串时不需要足够大”)是16,正如其他人所说的,但我没有看到任何关于何时更改它的内容。

当您可以将其更改为可能的优化时,您应该进行更改。实际上,选择16与优化相反。优化是选择值和方法,以便特别适合特定情况或可能情况的子集,而不是通常使用该词来加速事物。在这里,类的设计者必须处理泛化,选择值和方法,以便在广泛的情况下提供合理的性能。

它们越小,使用的内存就越少。

它们越大,重新分配更大的字符串的数量就越少。

有几个原因说明二进制舍入(整数次幂)在某些情况下可能比其他数字更具优势,因此他们选择了其中一个,但除此之外,在4、16或1024之间的选择是平衡不同可能值的结果。

StringBuilder的使用者而不是设计者,可能更清楚他们可能需要多大的尺寸。

如果他们要Append 5个一位数字以及总长度为43个字符的字符串,则StringBuilder的总长度将始终为48个字符,因此他们应该使用容量为48的大小作为48始终是一个字符串长度48最有效的大小。

如果他们正在做某些可能会有大约23到34个字符之间的任何长度的事情,则应使用34。

如果他们正在做的事情永远不可能超过60个字符,但是每隔一段时间可能会发生这种情况,那么他们应该使用64(对于大多数部分不重新分配,并且在偶尔出现需要重新分配时获得上述二次幂的好处)。

如果无法得出结论,或者至少很难做到这一点而不是性能热点,则应该使用默认设置。


6

7
这是一个很好的提醒,让我编辑文章,在某处包含“容量”这个词 :) - Jon Skeet
14
好的文章,但没有回答任何一个问题。 - Webveloper
2
@JonSkeet - 仍然缺少“capacity”的词。虽然是一篇有趣的文章。 - flacnut
4
这个答案没有包含任何细节,只有一个链接。 - GaTechThomas

2

String-Builder的默认容量为16个字符,而其最大容量为2147483647个字符

因此,不需要担心存储长响应!


你能否添加一个链接到确认这一点的文档? - Noel Widmer
我已经在我的项目中尝试过了。如果你想尝试的话,可以在dotnetfiddle.net上练习它。 - Deep Jadia
StringBuilder类(System.Text)| Microsoft Docs此链接提供了有关StringBuilder类的详细信息,包括如何实例化一个StringBuilder对象。 - Jun Yu

1
我们可以使用 StringBuilder 类的 capacity 属性来查找容量:
StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

这里的容量定义了 StringBuilder 的默认容量。

StringBuilder 的最大容量与 Int32 的最大值相同。


-1

[编辑:当时问题是关于 StringList 的]

你是指 StringCollection 吗?它最初使用一个空的 ArrayList,所以答案是0。而且你没有更改它的选项。当你第一次添加一个项目时,容量会跳到4,然后在填充时使用加倍策略。

如果你指的是 List<string>,那么它类似(一个空的 T[],而不是 ArrayList),但如果需要的话,你可以初始化一个已知的大小(即你知道你期望的数据量)。同样,第一次向 List<T> 添加时,大小会跳到4,然后每次填满时都会加倍。


1
我认为他的意思是 StringBuilder,没有别的。 - Boris Callens

-1

在这里阅读关于Stringbuilder容量的内容,还有一个示例应用程序来证明它。


1
该链接文章提到的是最大容量,而不是默认容量(16)。 - Matt Lacey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接