後者はパターン正規表現を使用し、前者は使用しないため、String.replace は String.replaceAll よりも高速であると考えていました。しかし実際には、パフォーマンスにも実装にも大きな違いはありません。これです:
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
ここでパターンを使用する必要は何ですか? 非正規表現置換バージョンを作成しました
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 は本当に非効率的ですか?