2008-11-13 76 views
28

如果您必須使用String.Replace()替換50次測試,則必須創建一個新的字符串50次。 StringBuilder.Replace()是否更有效地執行此操作?例如,如果我要替換很多文本,我應該使用StringBuilder嗎?即使我不會將任何數據附加到它上面?是StringBuilder.Replace()比String.Replace更有效嗎?

我使用.NET,但我認爲這將與Java和其他語言相同。

+3

StringBuilder.Replace應該使用較少的內存,但它不會比string更高性能。更換http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx – 2011-04-28 18:43:17

回答

29

這正是StringBuilder用於重複修改同一文本對象的類型 - 它不僅僅用於重複連接,儘管這似乎是最常用的。

5

是的。 String.Replace總是會創建一個新字符串 - StringBuilder.Replace不會。

+2

這不完全是真的,看看源代碼。 StringBuilder.replace()調用AbstractStringBuilder.replace(),如果需要調用AbstractStringBuilder.expandCapacity()。 AbstractStringBuilder.expandCapacity()調用Arrays.copyOf(),它創建一個新的字符數組 - 這與創建一個新的String相同。 – 2010-01-19 06:48:18

+4

@Avi:「不」引用「`String.Replace` * always *創建一個新的字符串」,注意對「always」的強調。 – 2010-01-19 13:30:04

8

這取決於如果更換的大小爲larger than the string replaced.

StringBuilder的在分配其緩衝區,而弦永遠只能擁有許多字符怎麼過都在上面。

StringBuilder.Capacity屬性是緩衝區容納的字符數,而StringBuilder.Length是使用了多少個字符。

通常情況下,您應該將StringBuilder.Capacity設置爲一個大於預期結果字符串的值。否則,StringBuilder將需要重新分配其緩衝區。 當StringBuilder的重新分配的緩衝區,這意味着一對夫婦重新分配後,它可能是顯著更大然後它需要的,默認情況下容量加倍它的大小,開始於16

通過設置容量值,當您開始(例如在構造函數中)您保存StringBuilder緩衝區的重新分配。您可以使用StringBuilder.MaxCapacity來限制StringBuilder可以擴展到的最大容量。

相關問題