Tại sao String bất biến trong Java là một trong những câu hỏi phỏng vấn phổ biến. String là một trong những class được sử dụng nhiều nhất trong bất kỳ ngôn ngữ lập trình nào. Chúng ta biết rằng trong Java, String là bất biến (immutable) và final. Java runtime duy trì một String pool, điều này làm cho String trở thành một class đặc biệt.

Tại sao String bất biến trong Java?
Hãy cùng xem một số lợi ích của việc String là immutable, điều này sẽ giúp ta hiểu rõ hơn tại sao String lại bất biến trong Java.
- String pool chỉ khả thi nhờ việc String là immutable trong Java. Bằng cách này, Java Runtime tiết kiệm được rất nhiều heap space, vì nhiều biến String khác nhau có thể cùng tham chiếu đến một String trong pool. Nếu String không phải là bất biến, thì String interning sẽ không thể tồn tại. Bởi vì khi một biến thay đổi giá trị, sự thay đổi đó sẽ ảnh hưởng đến tất cả các biến khác đang tham chiếu đến cùng một String.
- Nếu String không phải là bất biến thì nó có thể gây ra mối đe dọa bảo mật nghiêm trọng cho ứng dụng. Ví dụ, trong quá trình kết nối cơ sở dữ liệu, username và password thường được truyền dưới dạng String để lấy kết nối. Trong socket programming, các thông tin như host và port cũng được truyền dưới dạng String. Nhờ việc String là immutable, giá trị của nó không thể bị thay đổi. Nếu không, một hacker có thể chỉnh sửa giá trị mà biến String đang tham chiếu, từ đó gây ra các lỗ hổng bảo mật trong ứng dụng.
- Vì String là bất biến nên nó an toàn khi sử dụng trong môi trường multithreading. Một String instance duy nhất có thể được chia sẻ cho nhiều thread khác nhau. Điều này giúp tránh việc phải sử dụng đồng bộ hóa để đảm bảo thread-safety. Nói cách khác, String mặc định là thread-safe.
- String được sử dụng trong Java ClassLoader, và tính chất không thay đổi giúp đảm bảo tính bảo mật, rằng đúng class sẽ được ClassLoader tải vào. Ví dụ, hãy tưởng tượng một tình huống khi bạn muốn load class
java.sql.Connection, nhưng giá trị tham chiếu lại bị thay đổi thànhmyhacked.Connection. Class này có thể thực hiện những hành động không mong muốn trên cơ sở dữ liệu của bạn. - Vì String là bất biến nên hashcode của nó được lưu trữ (cached) ngay tại thời điểm khởi tạo và không cần phải tính toán lại nhiều lần. Điều này khiến String trở thành một lựa chọn lý tưởng để làm key trong Map, đồng thời giúp quá trình xử lý nhanh hơn so với các đối tượng khác dùng làm HashMap key. Đây chính là lý do String được sử dụng phổ biến nhất làm key trong HashMap.
Trên đây là một số lý do mà tôi có thể nghĩ ra, cho thấy những lợi ích của việc String là bất biến. Đây là một tính năng tuyệt vời của Java String class, và cũng chính điều này làm cho nó trở nên đặc biệt. Bạn có thể đọc thêm bài viết này để biết cách tự viết một immutable class.
Bạn có thể tham khảo thêm nhiều ví dụ về Java String trong GitHub Repository của chúng tôi.