替换字符串中出现的所有子字符串 – 这在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
数组或其他一些可变类型(如StringBuffer
或StringBuilder
)。
你不应该比较replaceAll 2次吗? 但是,对于单个调用,它几乎不可测量。 你会做数百万次比较吗?
然后我希望’compile’更快,但只有,如果你不使用没有任何模式规则的常量字符串。
编写微基准的问题在哪里? 或者查看源代码。