// 4. hét – Miért lassú a + összefűzés ciklusban? String vs StringBuilder
// Futtatás: java Builder.java
public class Builder {

    // Minden += egy ÚJ stringet hoz létre, és átmásolja a régit: összesen O(n²)
    static String concatPlus(int n) {
        String s = "";
        for (int i = 0; i < n; i++) s += "x";
        return s;
    }

    // A StringBuilder módosítható, dinamikus tömbként működik: amortizáltan O(1) / hozzáfűzés
    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);
        }

        // A StringBuilder további műveletei
        StringBuilder sb = new StringBuilder("adatszerkezet");
        sb.insert(0, ">> ").append("!").reverse();
        System.out.println(sb);
    }
}
