2008-10-29 69 views

回答

0

[編輯:當時,這個問題問StringList]

你的意思StringCollection?這最初使用空的ArrayList,所以答案是0.你沒有選擇改變它。當你第一次添加一個物品時,容量跳到4,然後在填充時使用加倍策略。

如果你的意思List<string>,那麼它是相似的(空T[],而不是一個ArrayList),但你可以,如果你需要初始化一個已知的大小(即你知道你有多少數據預期)。同樣,第一次你AddList<T>大小跳到4,然後每填滿一次就翻倍。

+0

我認爲他確實是指StringBuilder,沒有別的。 – 2008-10-29 09:38:04

+0

對不起,我感到困惑 – 2008-10-29 09:42:54

+1

啊;所以對不同的問題很好的回答......哦,好的;-( – 2008-10-29 10:32:10

-1

閱讀聽到關於Stringbuilder capacity,也有示例應用程序來證明它。

+1

鏈接的文章是指最大容量,不是默認容量(16) – 2008-10-29 09:44:42

43

默認容量爲16個字符(我用.net反射來查找出來)。

34

默認值爲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的內部字符數組被重新分配給它的兩倍當前大小。

10

今天這個問題作爲另一個副本來了,但我注意到一部分沒有回答。默認情況下(假設這意味着「當沒有用足夠大的字符串創建時」)是16,如同人們所說的那樣,但是當你應該改變它的時候,我什麼都看不到。可以做爲一種可能的優化,事實上,選擇16與優化是相反的優化選擇價值和方法以便特別適合特定情況或可能情況的子集(不是「 「一般來說,雖然這就是我們經常使用這個詞的原因),在這裏,設計師必須處理概括 - 挑選值和方法,以便在廣泛的案例中給出相當好的表現

他們走得越小,內存的使用就越少。

他們去的越大,處理更大字符串的重新分配越少。

在某些情況下,二元輪(兩個整數)可能會比其他數字具有更好的性能的原因有幾個,所以他們選擇了其中一個,但除了選擇4或16或1024之外是平衡不同可能值的問題。

有人使用StringBuilder而不是設計它,可能有一個更好的想法,他們可能需要什麼大小。

如果他們打算去Append 5個1位數的數字和長度總共爲43個字符的字符串,那麼StringBuilder的總長度將是48個字符,所以他們應該使用一個容量爲對於48長度的字符串,48總是最有效的尺寸。

如果他們正在做的事情,其中​​有可能是約23和34個字符之間的任何長度,就應該使用34

如果他們正在做的事情哪裏有可能永遠不會超過60個字符,但現在每然後可能有,他們應該使用64(不要爲大多數部分重新分配,並在少數情況下獲得上面提到的權力 - 效益)。

如果在這方面無法得出結論,或者至少很難這樣做,而不是性能熱點,那麼您應該使用默認設置。

1

我們可以使用StringBuilder類的能力屬性找到容量:

StringBuilder builder = new StringBuilder(); 
var capacity = builder.Capacity; 
var maxCapacity = builder.MaxCapacity; 

這裏容量定義StringBuilder默認容量。

StringBuilderMax Capacity與最大值Int32相同。字符串助洗劑

0

缺省容量爲16個字符, 和STRING-生成器的最大容量爲2147483647字符

所以沒有必要擔心存儲長響應!