String bất biến nên mỗi phép + tạo ra một chuỗi mới và copy toàn bộ nội dung cũ.
Trong vòng lặp n lần, tổng khối lượng copy là O(n²).
java
String s = "";
for (String part : parts) {
s += part; // O(n^2): mỗi vòng copy lại toàn bộ chuỗi
}
StringBuilder sb = new StringBuilder();
for (String part : parts) {
sb.append(part); // O(n)
}
String result = sb.toString();
String joined = String.join(", ", parts); // gọn nhất khi chỉ cần ghépCompiler dịch thành gì:
- Trước Java 9: javac tự đổi a + b + c thành chuỗi StringBuilder.append(...). Đây là lý do phép + một dòng không hề chậm.
- Từ Java 9 (JEP 280): javac phát sinh lệnh invokedynamic trỏ tới StringConcatFactory, để runtime tự chọn chiến lược nối tối ưu.
Chốt: javac chỉ tối ưu được trong một biểu thức; nó không gộp được các phép + nằm ở các vòng lặp khác nhau. Vì vậy + trên một dòng thì cứ dùng, còn tích lũy qua vòng lặp thì phải StringBuilder khai báo ngoài vòng lặp.