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)
和notreplaceAll
不要忽略最重要的考虑因素之一:依赖第三方库会使程序变得更大,更不易移植,并且会受到该库的安全问题的影响。Java SE虽然并不完美,但它的QA和文档质量要比我遇到的任何第三方库都要好得多。iirc String.replace(CharSequence c1,CharSequence c2)仍在使用正则表达式模式编译器,这会使它的速度慢一点。我将用基准源更新帖子。