2008-11-13 74 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可以扩展到的最大容量。

相关问题