【问题标题】:Java ReplaceAll vs For loop with Replace in itJava ReplaceAll vs For 循环,其中包含 Replace
【发布时间】:2014-11-19 12:37:33
【问题描述】:

我有一个包含一些数据的字符串,我需要从中删除一些特殊字符并标记数据。

为了获得更好的性能,应该首选以下两种方法中的哪一种:

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 循环将用于对每个令牌执行其他逻辑。
是对整个内容施加替换方法更快,还是在 for 循环中对每个标记进行替换(无论替换如何都执行)更快?

即替换一次并执行其他操作或对每个令牌逐步替换,然后执行所需的操作。

提前致谢

【问题讨论】:

标签: java performance replace execution-time replaceall


【解决方案1】:

没有任何循环,只需replace 就足够了。

replaceAll 在后台使用正则表达式引擎,这具有更多的性能开销。

似乎对这个“All”后缀有一个普遍的误解。

Difference between String replace() and replaceAll()

更新

发现与这个问题非常相似的问题:

Removing certain characters from a string

【讨论】:

  • 感谢您的回复以及帮助我​​更好地理解替换功能的链接,过去几个月我一直在研究replacereplaceAll,今天我知道replace 和replaceAll 实际上替换所有字符,被替换函数中的所有后缀误解,我认为 replaceAll 将在内部使用 for 循环来替换所有出现的数据,这对我来说又是错误的。谢谢你分享信息。一个小疑问,有没有我可以使用replaceAll 而不是replace 的场景?
  • @Abhishek replace 是一个特例 equivalent to 在调用 replaceAll 之前引用输入。你需要的是replaceAll("[?.,()]", "")
  • 我的真正意思是对整个内容施加的替换功能更快还是在for循环中的每个标记上替换(For循环无论如何用于其他操作)更快?
  • @Abhishek,当然,单个替换会更快,因为涉及的复制操作和内存分配更少。
  • @Vadzim 谢谢你的回复
【解决方案2】:

我不知道此类问题的统计数据,但首先,如果您担心性能,我会将各种 replaceAll() 调用替换为单个调用,如下所示:

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

它可能会更快。

【讨论】:

  • 在 Java 中,您必须将反斜杠加倍,否则将无法编译,例如\? 是非法的转义序列。有关更简单的正则表达式,请参阅我的其他评论。
  • 同意。我在 Regexplanet 中测试了这个表达式,却忘了加倍反斜杠。谢谢指正。
猜你喜欢
  • 2014-03-16
  • 2012-10-08
  • 2017-11-07
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
相关资源
最近更新 更多