Cả ba giữ chuỗi, khác nhau ở mutable và thread-safe:
| Loại | Mutable | Thread-safe | Tốc độ |
|---|---|---|---|
| String | Không (bất biến) | Có (do bất biến) | chậm khi nối nhiều |
| StringBuilder | Có | Không | nhanh nhất |
| StringBuffer | Có | Có (synchronized) | chậm hơn Builder ~10–30% |
java
// Nối 10k lần: String tạo ra 10k object tạm thời; StringBuilder sửa tại chỗ
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10_000; i++) sb.append(i);
String result = sb.toString();Vì sao: String bất biến nên mỗi + tạo object mới — O(n²) khi lặp. StringBuilder/StringBuffer có buffer sửa tại chỗ.
Tóm lại: đơn luồng (99% trường hợp) → StringBuilder. Nhiều thread ghi chung 1 buffer → StringBuffer (hiếm). Chuỗi cố định/ít nối → String. Đừng "cho chắc" mà chọn StringBuffer — synchronized phí vô ích nếu chỉ 1 thread.