// 第 4 周 – 为什么在循环中用 + 拼接很慢？String 与 StringBuilder
// 运行：java Builder.java
public class Builder {

    // 每次 += 都创建一个新字符串并复制旧的：总共 O(n²)
    static String concatPlus(int n) {
        String s = "";
        for (int i = 0; i < n; i++) s += "x";
        return s;
    }

    // StringBuilder 是可变的，像动态数组一样工作：每次追加均摊 O(1)
    static String concatBuilder(int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) sb.append("x");
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println("        n   String += (ms)   StringBuilder (ms)");
        for (int n = 10_000; n <= 160_000; n *= 2) {
            long t0 = System.nanoTime();
            concatPlus(n);
            long t1 = System.nanoTime();
            concatBuilder(n);
            long t2 = System.nanoTime();
            System.out.printf("%,9d %16.1f %20.2f%n", n, (t1 - t0) / 1e6, (t2 - t1) / 1e6);
        }

        // StringBuilder 的其他操作
        StringBuilder sb = new StringBuilder("datastructure");
        sb.insert(0, ">> ").append("!").reverse();
        System.out.println(sb);
    }
}
