Skip to content

字符串拼接优化

字符串拼接的性能差异巨大,选择合适的方式能显著提升效率。

拼接方式对比

方式性能场景
+ 拼接少量拼接
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 使用

基于 VitePress 构建