【问题标题】:Is StringBuilder.Replace() more efficient than String.Replace?StringBuilder.Replace() 是否比 String.Replace 更有效?
【发布时间】:2010-09-22 05:13:22
【问题描述】:

如果您必须使用 String.Replace() 替换 test 50 次,那么您实际上必须创建一个新字符串 50 次。 StringBuilder.Replace() 这样做更有效吗?例如,如果我要替换大量文本,我是否应该使用 StringBuilder,即使我不会向其中添加任何数据?

我使用的是 .NET,但我认为这与 Java 和可能的其他语言相同。

【问题讨论】:

标签: .net string stringbuilder


【解决方案1】:

取决于替换的大小是否为larger than the string replaced.

StringBuilder 过度分配其缓冲区,而字符串只保存其中的字符数。

StringBuilder.Capacity 属性是缓冲区将容纳多少个字符,而 StringBuilder.Length 是正在使用的字符数。

通常您应该将 StringBuilder.Capacity 设置为大于预期结果字符串的值。否则 StringBuilder 将需要重新分配其缓冲区。 当 StringBuilder 重新分配它的缓冲区时,它的大小会加倍,这意味着在几次重新分配之后,它可能会比它需要的大得多,默认容量从 16 开始。

通过在启动时设置容量值(例如在构造函数中),您可以保存 StringBuilder 缓冲区的重新分配。您可以使用 StringBuilder.MaxCapacity 来限制 StringBuilder 可以扩展到的最大容量。

【讨论】:

  • 使用 StringBuilder 创建的字符串通常也包含超过“有用”字符的数量 - 因为 StringBuilder 实际上只包含一个用作缓冲区的字符串。
【解决方案2】:

这正是 StringBuilder 的用途——重复修改同一个文本对象——它不只是用于重复连接,尽管这似乎是它最常用的用途。

【讨论】:

【解决方案3】:

是的,是的。 String.Replace 总是创建一个新字符串——StringBuilder.Replace 不会。

【讨论】:

  • 这话不完全对,看源码。 StringBuilder.replace() 正在调用 AbstractStringBuilder.replace() ,如果需要,它正在调用 AbstractStringBuilder.expandCapacity() 。 AbstractStringBuilder.expandCapacity() 正在调用 Arrays.copyOf() 来创建一个新的字符数组——这与创建一个新的字符串相同。
  • @Avi: “doesn't” 指的是“String.Replace always 创建一个新字符串”,注意强调“always”。
猜你喜欢
  • 2011-09-25
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多