【问题标题】:String#replaceAll vs StringUtils#replace()String#replaceAll 与 StringUtils#replace()
【发布时间】:2019-07-25 05:36:46
【问题描述】:

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

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

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

基准来源:Commons Lang StringUtils.replace performance vs String.replace

【问题讨论】:

  • 我认为最佳答案 here 解释得很好,可比较的选项是 String.replace(char sequence, char sequence) 而不是 replaceAll
  • 不要忽略最重要的考虑因素之一:对第三方库的依赖会使您的程序变得更大、更不便携,并且受制于该库的安全问题。 Java SE 虽然并不完美,但其 QA 和文档比我遇到的任何第三方库都要好。

标签: java performance replace


【解决方案1】:

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

使用String.replaceAll,您可以例如做这样的事情:

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

哪个会输出

Smith, John

StringUtils.replace 无法做到这一点。

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

String.replaceAll 始终将搜索词解析为正则表达式,并假设它也使用正则表达式函数来执行替换,因此在不实际使用正则表达式的情况下使用此方法根本没有意义。

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

从之前关于这个主题的几篇文章中,我看到有多个测试和基准指向 String.replace

有些来源会很好,您已经看到了该声明。 Nexevis 提供的链接涵盖了 Java 1.4,其中不存在上述方法,并且 - 现在我自己没有做一些测试 - 我怀疑 String.replace(CharSequence...)StringUtils.replace 之间的性能差异很大,因为 StringUtils' 的实现看起来很简单并且很可能与 JVM 中的实现没有太大区别。它的存在纯属历史原因,因为 1.5 之前的 Java 版本中没有类似的方法

【讨论】:

  • iirc String.replace(CharSequence c1, CharSequence c2) 仍在使用正则表达式模式编译器,这会使其速度变慢。我将使用基准源更新帖子。
猜你喜欢
  • 2012-06-05
  • 2010-11-30
  • 2011-10-24
  • 2012-10-08
  • 2022-07-18
  • 1970-01-01
  • 2014-09-04
  • 2014-03-08
  • 1970-01-01
相关资源
最近更新 更多