字符串替换All() vs. Matcher replaceAll() (性能差异)

2022-08-31 16:18:28

String.replaceAll() 和 Matcher.replaceAll() (在从 Regex.Pattern 创建的 Matcher 对象上)在性能方面是否存在已知的差异?

另外,两者之间的高级API有什么区别?(不可变性、处理 NULL、处理空字符串等)


答案 1

根据 String.replaceAll 的文档,它有以下关于调用该方法的说法:

调用这种形式的方法会产生与表达式完全相同的结果str.replaceAll(regex, repl)

Pattern.compile(regex).matcher(str).replaceAll(repl)

因此,可以预期调用 和显式创建匹配器模式之间的性能应该是相同的。String.replaceAll

编辑

正如注释中所指出的,不存在的性能差异对于单个调用 from 或 是真的,但是,如果需要执行多个调用 ,人们会期望保留编译的 ,因此不必每次都执行相对昂贵的正则表达式模式编译。replaceAllStringMatcherreplaceAllPattern


答案 2

源代码 :String.replaceAll()

public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

它必须首先编译模式 - 如果您要在短字符串上使用相同的模式多次运行它,那么如果您重用一个已编译的模式,性能将会好得多。