字符串拼接优化
字符串拼接的性能差异巨大,选择合适的方式能显著提升效率。
拼接方式对比
| 方式 | 性能 | 场景 |
|---|---|---|
| + 拼接 | 差 | 少量拼接 |
| StringBuilder | 好 | 单线程 |
| StringBuffer | 中 | 多线程 |
| concat() | 好 | 两个字符串 |
性能对比
java
public class ConcatBenchmarkDemo {
public static void main(String[] args) {
long start, end;
// 低效:循环内用 +
start = System.currentTimeMillis();
String result = "";
for (int i = 0; i < 10000; i++) {
result += "item" + i;
}
end = System.currentTimeMillis();
System.out.println("+ 拼接: " + (end - start) + "ms");
// 高效:使用 StringBuilder
start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("item").append(i);
}
end = System.currentTimeMillis();
System.out.println("StringBuilder: " + (end - start) + "ms");
}
}StringBuilder 的性能通常比 + 快几十甚至上百倍。
最佳实践
java
public class BestPracticeDemo {
public static void main(String[] args) {
// 1. 少量拼接用 +
String s = "Hello" + " " + "World";
// 2. 循环内用 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
sb.append(i).append(",");
}
// 3. join 方法(JDK 8+)
String joined = String.join(",", "a", "b", "c");
// 4. 字符串数组 join
String[] arr = {"a", "b", "c"};
String result = String.join(",", arr);
}
}StringJoiner
StringJoiner 适合需要统一分隔符、前缀、后缀的拼接场景:
java
import java.util.StringJoiner;
import java.util.stream.Collectors;
public class StringJoinerDemo {
public static void main(String[] args) {
// 带前缀和后缀
StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("a").add("b").add("c");
System.out.println(joiner.toString()); // [a, b, c]
// 用于 Stream
String result = java.util.Arrays.asList("a", "b", "c")
.stream()
.collect(Collectors.joining(", "));
System.out.println(result);
}
}注意事项
- 循环内避免 +:会产生大量中间对象,效率极低
- 单线程首选 StringBuilder:性能最优
- StringJoiner:适合列表拼接,可配合 Stream 使用
