Java cung cấp nhiều cách nối chuỗi, mỗi cách có ưu nhược điểm riêng.
1. Toán tử + – Đơn giản, compiler tối ưu thành StringBuilder
String s = "Hello" + " " + "World"; // Compile-time constant → "Hello World"
String a = "Hello";
String b = a + " World"; // Runtime → new StringBuilder().append(a).append(" World").toString()
2. String.concat() – Chỉ nối 2 chuỗi, trả về String mới
String s = "Hello".concat(" World"); // "Hello World"
// Chuỗi rỗng: "Hello".concat("") → "Hello" (tối ưu trả về this)
3. StringBuilder – Hiệu năng tốt nhất cho nhiều lần nối
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i).append(",");
}
String result = sb.toString();
4. StringBuffer – Thread-safe version của StringBuilder
StringBuffer sbf = new StringBuffer();
sbf.append("Thread-safe");
5. String.join() / StringJoiner (Java 8+) – Có delimiter
String csv = String.join(",", "a", "b", "c"); // "a,b,c"
StringJoiner sj = new StringJoiner(",", "[", "]");
sj.add("a").add("b");
System.out.println(sj); // "[a,b]"
So sánh hiệu năng (100,000 lần nối)
| Phương pháp | Thời gian (ms) | Bộ nhớ | Ghi chú |
|---|---|---|---|
| + trong loop | ~5000 | Cao (GC pressure) | ❌ Không bao giờ |
| concat() trong loop | ~4500 | Cao | ❌ |
| StringBuilder | ~15 | Thấp | ✅ Best |
| StringBuffer | ~25 | Thấp | Thread-safe |
| String.join | ~30 | Trung bình | Array/Iterable |
Khuyến nghị
- Nối vài chuỗi tĩnh: dùng
+(đọc dễ) - Nối trong loop / nhiều chuỗi:
StringBuilder - Cần delimiter:
String.join()hoặcStringJoiner - Đa luồng chia sẻ buffer:
StringBuffer