Java ReplaceAll与带有Replace的For循环的区别

3
我有一个字符串,其中包含一些数据,我需要从中删除一些特殊字符并对数据进行分词。
以下两种方法哪个更适合提高性能:
String data = "Random data (For performance) Waiting for reply?"
data=data.replaceAll("?", "");
data=data.replaceAll(".", "");
data=data.replaceAll(",", "");
data=data.replaceAll("(", "");
data=data.replaceAll(")", "");  

String[] tokens = data.split("\\s+");  
for(int j = 0; j < tokens.length; j++){
  //Logic on tokens
}  

或者

String data = "Random data (For performance) Waiting for reply?"

String[] tokens = data.split("\\s+");  
for(int j = 0; j < tokens.length; j++){
    tokens[j]=tokens[j].replace("?", "");
    tokens[j]=tokens[j].replace(".", "");
    tokens[j]=tokens[j].replace(",", "");
    tokens[j]=tokens[j].replace("(", "");
    tokens[j]=tokens[j].replace(")", "");      

  //Logic on each token
}  

还有其他方法可以提高性能吗?是否有相关的统计数据可供参考?

上面提供的For循环将用于对每个标记执行其他逻辑。

是对整个内容执行替换方法更快,还是分别对每个标记执行替换方法(无论是否进行替换操作)更快?

即一次性替换并执行其他操作,还是逐步替换每个标记,然后执行所需的操作。

提前感谢您的帮助。


3
请看这个链接:https://www.cqse.eu/en/blog/string-replace-performance/。 - codeMan
1
每一个“哪个代码更快,这个还是那个”问题的答案都是“进行性能分析并查看结果”。 - Sebastian Redl
对于你的第一个例子,我更喜欢使用data=data.replaceAll("[\\.,\\(\\)?]");来一次性替换所有。这样会快得多。 - Uwe Allner
可能是 https://dev59.com/1XTYa4cB1Zd3GeqPsDZU 的重复问题。 - Vadzim
另一个重复的问题:https://dev59.com/6m435IYBdhLWcg3whAWx - Vadzim
2个回答

4

感谢您的回复和提供的链接,这些帮助我更好地理解替换函数。过去几个月我一直在研究replacereplaceAll,今天我才知道它们都实际上替换了所有字符。我误解了replace函数中的后缀"All",并且我认为replaceAll会在内部使用for循环来替换所有出现的数据,这也是我的错误。非常感谢您分享这些信息。还有一个小问题, 是否有任何情况下我可以使用replaceAll而不是replace - Abhishek
2
@Abhishek replace是一个特殊情况,相当于在调用replaceAll之前引用输入。你需要的是replaceAll("[?.,()]", "") - maaartinus
我实际上想问的是,对于整个内容施加替换功能和在for循环中每个标记上进行替换(无论如何,for循环都用于其他操作),哪种方法更快? - Abhishek
1
@Abhishek,单个替换肯定会更快,因为它涉及的复制操作和内存分配较少。 - Vadzim
@Vadzim 谢谢您的回复。 - Abhishek

1

我不知道这种问题的统计数据,但首先,如果您关心性能,我建议用单个replaceAll()代替各种调用,像这样:

data=data.replaceAll("\\?|\.|\\)|\\(|,", "");

可能会更快。


2
在Java中,必须将反斜杠加倍,否则它将无法编译,例如\?是非法的转义序列。请参见我的其他评论以获取更简单的正则表达式。 - maaartinus
同意。我在Regexplanet中测试了表达式,忘记双倍反斜杠了。感谢您的纠正。 - rlinden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接