Java 字符串#replaceAll vs StringUtils#replace()

Java 字符串#replaceAll vs StringUtils#replace(),java,performance,replace,Java,Performance,Replace,是否有任何理由使用String.replaceAll(String,String)而不是StringUtils.replace() 假设两个库都可用,并且我们没有传入正则表达式 从之前关于这个主题的几篇文章中,我看到有多个测试和基准指向String.replace很慢,但我不记得有人解释过是否有理由在StringUtils.replace上使用String.replaceAll 基准测试的源代码:String.replaceAll和StringUtils.replace(假设这里是Apache

是否有任何理由使用
String.replaceAll(String,String)
而不是
StringUtils.replace()

假设两个库都可用,并且我们没有传入正则表达式

从之前关于这个主题的几篇文章中,我看到有多个测试和基准指向
String.replace
很慢,但我不记得有人解释过是否有理由在
StringUtils.replace上使用
String.replaceAll


基准测试的源代码:

String.replaceAll
StringUtils.replace
(假设这里是Apache Commons)是两个完全不同的野兽。前者使用正则表达式作为搜索词,并在支持正则表达式的情况下执行替换,后者只查找给定文本的出现处,并用替换文本替换它

使用
String.replaceAll
可以执行以下操作:

System.out.println("John Smith".replaceAll("^(\S+)\s*(\S+)\*$", "$2, $1"));
哪个会输出

Smith, John
使用
StringUtils.replace
无法执行此操作

假设两个库都可用,并且我们没有传入正则表达式


String.replaceAll
总是将搜索词解析为Regex,并假设它也使用Regex函数来执行替换,因此在不实际使用Regex的情况下使用此方法是没有意义的

如果您只想做一个简单的文本替换,那么只需使用Java 1.5中添加的
String.replace(CharSequence c1,CharSequence c2)

从前面关于这个主题的几篇文章中,我看到有多个测试和基准指向该字符串。replace


有些消息来源会很好,你已经看到了这句话。Nexevis提供的链接涵盖了Java 1.4,其中不存在上述方法,并且-现在我自己没有做一些测试-我怀疑
String.replace(CharSequence…)之间的性能
StringUtils.replace
有很大不同,因为
StringUtils
“实现看起来非常简单,很可能与JVM中的实现没有太大区别。它的存在纯粹是历史性的,因为在1.5之前的Java版本中没有类似的方法

我认为上面的答案可以很好地解释它,可比较的选项是
String.replace(char-sequence,char-sequence)
和not
replaceAll
不要忽略最重要的考虑因素之一:依赖第三方库会使程序变得更大,更不易移植,并且会受到该库的安全问题的影响。Java SE虽然并不完美,但它的QA和文档质量要比我遇到的任何第三方库都要好得多。iirc String.replace(CharSequence c1,CharSequence c2)仍在使用正则表达式模式编译器,这会使它的速度慢一点。我将用基准源更新帖子。