我知道有两种方法可以替换字符串中所有子串的出现。
正则表达式方式(假设“要替换的子字符串”不包括正则表达式特殊字符):
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");
两者中的哪一个更有效(以及为什么)?
是否有比上述两种更有效的方式?
答案 0 :(得分:12)
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
在每次调用时都会创建一个 new 字符串)。例如,请参阅StringBuilder.replace()。
编译正则表达式会产生相当很多的开销,这在观察Pattern source code时很明显。幸运的是,Apache在StringUtils.replace()
中提供了一种替代方法,根据source code(第3732行)非常有效。
答案 1 :(得分:2)
这是来自openjdk的source code:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
答案 2 :(得分:1)
使用string
数组或其他一些可变类型(例如StringBuffer
或char
),而不是使用不可变的StringBuilder
。
答案 3 :(得分:1)
没有进行任何分析或基准测试,我会说这是一个相当安全的选择,如果你不需要正则表达式魔法,那么正则表达式解析器的开销(无论如何,你都会得到,就其而言内存以及CPU使用率)比你在另一端可能获得的成本高得多。
答案 4 :(得分:0)
你不应该比较replaceAll 2次吗?但是,对于单个调用,它几乎不可测量。你会做数百万次比较吗?
然后我希望'compile'更快,但只有,如果你不使用没有任何模式规则的常量字符串。
编写微基准的问题在哪里?或者查看源代码。