什么是内存有效的方法来将一些字符串模式替换为其他模式

时间:2012-11-29 01:27:00

标签: java

例如:

我给了一个字符串:“我现在上学,现在上学”

要求正在改变I - >我们& am - >因此输出看起来像“我们现在要上学,我们现在要上学”

这意味着我必须将一些字符串模式替换为另一种模式。

最好在Java中实现这一目标

3 个答案:

答案 0 :(得分:4)

在内存效率方面处理字符串总是很糟糕,因为你不能更改字符串,只能创建新的字符串。 最好的方法是接收一个StringBuilder(StringBuffer,如果你需要ThreadSafe),然后使用一些算法来改变字符串或类似的东西: http://www.java-examples.com/java-stringbuffer-replace-example

但是,如果你自己收到一个字符串,我只会使用replaceAll方法创建一个新字符串,因为你需要这样做,即使使用字符串缓冲区:

http://www.roseindia.net/java/string-examples/string-replaceall.shtml

如果你需要在字符串中进行多次后续更改,它总是先付费转换为字符串缓冲区。

答案 1 :(得分:1)

这取决于你想要做什么。

  • 如果您只想将所有出现的“I”替换为“We”而将“am”替换为“are”,则String.replace将比String.replaceAll更有效地记忆效率

  • 如果您想将“我”和“我”视为单词而不是字符序列,则String.replace将无效。相反,您需要将String.replaceAll与使用字边界匹配的模式一起使用,以避免将"I am going to school on a camel"转换为"We are going to school on a careel"

在这两种情况下,您应该能够通过使用StringBuilder手动完成工作并循环迭代原始字符串的字符并构建新字符串来获得更好的内存效率(即更少的垃圾生成)。

然而 ......这样的编码是痛苦的,而不是你应该考虑做的事情,除非你有令人信服的证据证明你需要这样做。过早优化是个坏主意。 99.9%的时间,如果你创造的垃圾比理论上需要的垃圾多一点也没关系。

答案 2 :(得分:0)

这取决于您的应用。这可能就像其他海报所展示的一样简单,或者它很复杂,并且是计算机科学的一部分。在后一种情况下,构建所谓的“trie”。这就像一棵树,但每个节点都有音节。
导航系统使用它来记忆有效地存储一个国家所有街道的街道名称。