Trong lập trình Java, các đối tượng String
được gọi là “immutable”, có nghĩa là sau khi một đối tượng String
được tạo ra, giá trị của nó không thể thay đổi. Điều này có nghĩa là một khi một đối tượng String
đã được khởi tạo với một giá trị, bạn không thể thay đổi nội dung của nó.
Khi thực hiện các thao tác trên chuỗi như nối chuỗi, cắt chuỗi, thay thế, Java sẽ không thay đổi đối tượng String
gốc, thay vào đó, nó tạo ra một đối tượng String
mới chứa kết quả của các thao tác này. Do đó, đối tượng String
ban đầu vẫn không thay đổi và được coi là bất biến (immutable).
Sự bất biến của String
mang lại một số lợi ích, bao gồm:
- An toàn luồng (Thread-safe): Đối tượng
String
không thể thay đổi, do đó, nếu nhiều luồng cùng truy cập vào một đối tượngString
, bạn không cần phải lo lắng về các vấn đề liên quan đến đồng bộ hóa (synchronization). - Tối ưu hiệu suất: Khi các thao tác trên chuỗi được thực hiện và tạo ra các đối tượng
String
mới, việc sử dụng bộ nhớ sẽ được tối ưu hơn so với việc sửa đổi chuỗi ban đầu. Điều này giúp tránh tình trạng “garbage collection” thường xảy ra khi thay đổi chuỗi. - An toàn từ môi trường: Do
String
là bất biến, nó được coi là an toàn khi được truyền vào các môi trường không tin cậy, chẳng hạn như các phương thức công cộng hoặc các đối số của phương thức.
Để thực hiện các thay đổi hoặc thao tác mới trên một chuỗi, bạn nên sử dụng lớp StringBuilder
hoặc StringBuffer
. Cả hai lớp này cung cấp các phương thức thay đổi chuỗi mà không tạo ra các đối tượng String
mới, giúp cải thiện hiệu suất khi thực hiện các thao tác nhiều lần.
Dưới đây là một ví dụ minh họa về tính bất biến của String
:
java
public class ImmutableStringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = str1.concat(" World"); // Tạo ra một đối tượng String mới
System.out.println("str1: " + str1); // str1 không thay đổi
System.out.println("str2: " + str2); // str2 chứa giá trị mới
}
}
Output sẽ là:
makefile
str1: Hello
str2: Hello World
Như bạn có thể thấy, đối tượng str1
vẫn giữ nguyên giá trị ban đầu “Hello” và không bị thay đổi sau khi gọi phương thức concat()
. Thay vào đó, phương thức concat()
tạo ra một đối tượng String
mới str2
với giá trị “Hello World”.