首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String replaceAll()与Matcher replaceAll() (性能差异)

String replaceAll()与Matcher replaceAll() (性能差异)
EN

Stack Overflow用户
提问于 2009-09-24 00:00:30
回答 7查看 69.1K关注 0票数 59

这是一个非常简单的问题,但这个问题出自一个C/C++人员的口中,他深入了解了复杂的Java。

我知道我可以启动jUnit和我自己的一些性能测试来获得答案;但我只是想知道这是否存在。

就性能而言,String.replaceAll()和Matcher.replaceAll() (在从Regex.Pattern创建的Matcher对象上)之间是否存在已知差异?

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-09-23 16:06:45

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

str.replaceAll(regex, repl)的形式调用此方法会产生与

完全相同的结果

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

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

编辑

正如评论中所指出的,对于从StringMatcherreplaceAll的单个调用来说,性能差异是不存在的,但是,如果需要对replaceAll执行多个调用,则可以期望保留已编译的Pattern是有益的,因此不必每次都执行相对昂贵的正则表达式模式编译。

票数 96
EN

Stack Overflow用户

发布于 2009-09-23 16:08:11

String.replaceAll()的源代码

代码语言:javascript
复制
public String replaceAll(String regex, String replacement) {
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

它必须首先编译模式-如果你打算在短字符串上使用相同的模式多次运行它,如果你重用一个编译过的模式,性能会更好。

票数 30
EN

Stack Overflow用户

发布于 2009-09-23 16:07:41

主要区别在于,如果保留用于生成MatcherPattern,则可以避免每次使用正则表达式时都重新编译它。通过String,您无法获得像这样“缓存”的能力。

如果每次都有不同的正则表达式,那么可以使用String类的replaceAll。如果要将相同的正则表达式应用于多个字符串,请创建一个Pattern并重用它。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1466959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档