这是一个非常简单的问题,但这个问题出自一个C/C++人员的口中,他深入了解了复杂的Java。
我知道我可以启动jUnit和我自己的一些性能测试来获得答案;但我只是想知道这是否存在。
就性能而言,String.replaceAll()和Matcher.replaceAll() (在从Regex.Pattern创建的Matcher对象上)之间是否存在已知差异?
另外,两者之间的高级API有什么不同?(不变性、处理NULL、处理空字符串、煮咖啡等)
发布于 2009-09-23 16:06:45
根据String.replaceAll的文档,关于调用该方法,它有以下说明:
以str.replaceAll(regex, repl)的形式调用此方法会产生与
完全相同的结果
Pattern.compile(regex).matcher(str).replaceAll(repl)
因此,可以预期调用String.replaceAll和显式创建Matcher和Pattern之间的性能应该是相同的。
编辑
正如评论中所指出的,对于从String或Matcher对replaceAll的单个调用来说,性能差异是不存在的,但是,如果需要对replaceAll执行多个调用,则可以期望保留已编译的Pattern是有益的,因此不必每次都执行相对昂贵的正则表达式模式编译。
发布于 2009-09-23 16:08:11
String.replaceAll()的源代码
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}它必须首先编译模式-如果你打算在短字符串上使用相同的模式多次运行它,如果你重用一个编译过的模式,性能会更好。
发布于 2009-09-23 16:07:41
主要区别在于,如果保留用于生成Matcher的Pattern,则可以避免每次使用正则表达式时都重新编译它。通过String,您无法获得像这样“缓存”的能力。
如果每次都有不同的正则表达式,那么可以使用String类的replaceAll。如果要将相同的正则表达式应用于多个字符串,请创建一个Pattern并重用它。
https://stackoverflow.com/questions/1466959
复制相似问题