我前段时间遇到过同样的问题,来到这篇文章:使用 StringBuilder 替换所有出现的字符串?
使用帖子中给出的实现:
public static void main(String[] args) {
String from = "A really long string full of ands and ors";
String replaceFrom = "and";
String replaceTo = "or";
long initTime = System.nanoTime();
String result1 = from.replace(replaceFrom, replaceTo);
System.out.println("Time1: " + (System.nanoTime() - initTime));
System.out.println(result1);
StringBuilder sb1 = new StringBuilder(from);
initTime = System.nanoTime();
replaceAll(sb1, replaceFrom, replaceTo);
System.out.println("Time1: " + (System.nanoTime() - initTime));
System.out.println(sb1.toString());
}
// From https://stackoverflow.com/questions/3472663/replace-all-occurences-of-a-string-using-stringbuilder
public static void replaceAll(StringBuilder builder, String from, String to) {
int index = builder.indexOf(from);
while (index != -1) {
builder.replace(index, index + from.length(), to);
index += to.length(); // Move to the end of the replacement
index = builder.indexOf(from, index);
}
}
第二种解决方案的性能更好的解释是它依赖于 StringBuilder,一个可变对象,而不是 String 一个不可变对象。请参阅Java 中字符串的不变性以获得更好的解释。
此解决方案将同时使用 StringBuffer 和 StringBuilder,但如StringBuilder 和 StringBuffer 之间的区别中所述, StringBuffer 是同步的,而 StringBuilder 不是,因此如果您不需要同步,最好使用 StringBuilder。