替换字符串中出现的所有子字符串 – 这在Java中更有效?

我知道有两种方法可以替换字符串中所有出现的子字符串。

正则表达式方式(假设“要替换的子字符串”不包括正则表达式特殊字符):

String regex = "substring-to-be-replaced" + "+"; Pattern scriptPattern = Pattern.compile(regex); Matcher matcher = scriptPattern.matcher(originalstring); newstring = matcher.replaceAll("replacement-substring"); 

String.replace()方式:

 newstring = originalstring.replace("substring-to-be-replaced", "replacement-substring"); 

哪两个更有效(以及为什么)?

有没有比上述两种更有效的方法?

String.replace()使用下面的正则表达式。

 public String replace(CharSequence target, CharSequence replacement) { return Pattern.compile(target.toString(), Pattern.LITERAL) .matcher(this ).replaceAll( Matcher.quoteReplacement(replacement.toString())); } 

有没有比上述两种更有效的方法?

您可以使用例如由数组支持的实现,而不是不可变的String类(因为string.replace在每次调用时都会创建一个字符串)。 请参阅StringBuilder.replace() 。

编译正则表达式会产生很多开销,这在观察Pattern源代码时很明显。 幸运的是,Apache在StringUtils.replace()提供了一种替代方法,根据源代码 (第3732行)非常有效。

这是openjdk的源代码 :

 public String replace(CharSequence target, CharSequence replacement) { return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString())); } 

没有进行任何分析或基准测试,我会说这是一个相当安全的赌注,如果你不需要正则表达式魔法,那么正则表达式解析器的开销(无论如何,你将获得内存方面的内容)以及CPU使用率)比你在另一端可能获得的成本高得多。

而不是使用不可变的string s,使用char数组或其他一些可变类型(如StringBufferStringBuilder )。

你不应该比较replaceAll 2次吗? 但是,对于单个调用,它几乎不可测量。 你会做数百万次比较吗?

然后我希望’compile’更快,但只有,如果你不使用没有任何模式规则的常量字符串。

编写微基准的问题在哪里? 或者查看源代码。