Java 的 String.replace() 与 String.replaceFirst() 与自制程序

标签 java regex string performance replace

我有一个类正在做大量的文本处理。对于长度为 100->2000 个字符的每个字符串,我执行 30 种不同的字符串替换。

例子:

string modified;
for(int i = 0; i < num_strings; i++){
 modified = runReplacements(strs[i]);
 //do stuff
}

public runReplacements(String str){
  str = str.replace("foo","bar");
  str = str.replace("baz","beef");
  ....
  return str;
}

“foo”、“baz”和所有其他“目标”预计只会出现一次并且是字符串文字(不需要实际的正则表达式)。

如您所想,我很关心性能:)

鉴于此,

  • replaceFirst() 似乎是一个糟糕的选择,因为它不会使用 Pattern.LITERAL 并且会进行不需要的额外处理。

  • replace() 似乎是一个糟糕的选择,因为它将遍历整个字符串以寻找多个要替换的实例。

此外,因为我的替换文本每次都是相同的,所以我编写自己的代码似乎是有意义的,否则 String.replaceFirst()String.replace() 每次都会在后台执行一次 Pattern.compile。认为我应该编写自己的代码,这是我的想法:

  • 对每个所需的文字替换执行Pattern.compile() 一次(无需每次都重新编译)(即 p1 - p30)

  • 然后对每个 pX 执行以下操作:p1.matcher(str).replaceFirst(Matcher.quoteReplacement("desiredReplacement"));

这样我在第一次替换时放弃了 ship(而不是遍历整个字符串),我使用的是 literalregex,我没有做重新编译每一次迭代。

那么,哪种性能最好?

最佳答案

So, which is the best for performance?

测量它! ;-)

ETA:由于两个词的回答听起来无可挽回地尖酸刻薄,我将稍微详细说明一下。 “测量它并告诉我们......”因为关于你引用的各种方法(好的,所有)的性能可能有一些一般的经验法则,但我不知道。正如对此答案的一些评论所提到的那样,不同的方法很可能被应用程序环境淹没。因此,在体内 对其进行测量,如果这是一个真正的问题,请关注它。 (让我们知道进展如何...)

关于Java 的 String.replace() 与 String.replaceFirst() 与自制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843051/

相关文章:

c# - 如何在 ToString() 中显示 1 而不是 01;

java - 重新进入同步块(synchronized block)的成本

java - 使用同一对象的线程池

PHP 正则表达式 - 文本到链接

java - 试图用 Java 理解正则表达式中的 "Capturing groups"

python - 在字符串中查找连续的字母

java - BeanNameAware 和 BeanFactoryAware

java - swing java app 和 iframe - 双向通信

PHP - 从一行中提取两个值

java - 在java中对2d字符串数组进行排序 - 对数组中的索引元素进行排序