我曾经认为 String.replace 比 String.replaceAll 快,因为后者使用 Pattern 正则表达式,而前者没有。但实际上无论是性能还是实现上都没有显着差异。就是这个:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
这里有什么需要使用 Pattern 的?我写了一个非正则表达式替换版本
static String replace(String s, String target, String replacement) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; (i = sb.indexOf(target, i)) != -1; i += replacement.length()) {
sb.replace(i, i + target.length(), replacement);
}
return sb.toString();
}
并比较性能
public static void main(String args[]) throws Exception {
String s1 = "11112233211";
for (;;) {
long t0 = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
// String s2 = s1.replace("11", "xxx");
String s2 = replace(s1, "11", "22");
}
System.out.println(System.currentTimeMillis() - t0);
}
}
基准测试:我的版本 - 400ms
; JDK 版本 - 1700ms
.
我的测试是错误的还是 String.replace 真的低效?