String immutable = sau khi tạo xong, nội dung không thể thay đổi; mọi thao tác như concat(), replace() đều trả về một object mới thay vì sửa tại chỗ.
Lý do thiết kế:
- String pool cần nó: JVM duy trì vùng cache (String pool) nơi nhiều biến có thể trỏ chung một literal như
"hello". Nếu mutable, sửa qua một biến sẽ làm đổi luôn giá trị của biến khác — rất khó debug. - Mặc nhiên thread-safe: object bất biến → nhiều thread đọc chung mà không cần synchronization, không có race condition.
- Làm key
HashMapan toàn:hashCode()giữ nguyên trọn đời nên entry không bị "mất" sau khi put — bạn không cần lo entry bị "lạc" khi key thay đổi giá trị. - Bảo mật: password, URL, classloader path không bị thay đổi ngầm sau khi JVM hoặc security manager đã kiểm tra.
java
String s = "hi";
s.concat(" there"); // tạo object MỚI, KHÔNG đổi s
System.out.println(s); // vẫn "hi"
s = s.concat("!"); // muốn giữ thì gán lạiLỗi thường gặp: nối chuỗi trong vòng lặp bằng + tạo ra hàng loạt intermediate String object rác → dùng StringBuilder thay thế. Riêng JDK 9+ dùng invokedynamic (StringConcatFactory) để tối ưu +, nhưng StringBuilder vẫn an toàn hơn khi số lần lặp lớn.
Lưu ý: đối với dữ liệu nhạy cảm như password, nên dùng char[] thay vì String — vì char[] bạn xoá được ngay (Arrays.fill) còn String vẫn nằm trong pool hoặc heap cho đến khi GC thu hồi.