Tất cả các đối số trong Java được truyền theo giá trị. Khi bạn truyền một hàm String
cho một giá trị, giá trị được truyền là tham chiếu đến đối tượng Chuỗi, nhưng bạn không thể sửa đổi tham chiếu đó và đối tượng Chuỗi bên dưới là bất biến.
Nhiệm vụ
zText += foo;
tương đương với:
zText = new String(zText + "foo");
Đó là, nó (cục bộ) gán lại tham số zText
là tham chiếu mới, trỏ đến một vị trí bộ nhớ mới, trong đó là một vị trí mới String
chứa nội dung gốc zText
có "foo"
gắn thêm.
Đối tượng ban đầu không được sửa đổi và main()
biến cục bộ của phương thức zText
vẫn trỏ đến chuỗi gốc (trống).
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
in:
Original value:
Local value: foo
Final value:
Nếu bạn muốn sửa đổi chuỗi, bạn có thể sử dụng ghi chú StringBuilder
hoặc một số vùng chứa khác (một mảng hoặc một AtomicReference
lớp chứa tùy chỉnh) cung cấp cho bạn một mức bổ sung con trỏ bổ sung. Ngoài ra, chỉ cần trả về giá trị mới và gán nó:
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
in:
Original value:
Local value: foo
Final value: foo
Đây có lẽ là giải pháp giống Java nhất trong trường hợp chung - xem mục Java hiệu quả "Tính bất biến ưu tiên".
Tuy nhiên, như đã lưu ý, StringBuilder
thường sẽ cung cấp cho bạn hiệu suất tốt hơn - nếu bạn có nhiều việc phải làm, đặc biệt là trong vòng lặp, hãy sử dụng StringBuilder
.
Nhưng hãy cố gắng vượt qua bất biến thay Strings
vì có thể thay đổi StringBuilders
nếu bạn có thể - mã của bạn sẽ dễ đọc hơn và dễ bảo trì hơn. Xem xét việc tạo các tham số của bạn final
và định cấu hình IDE của bạn để cảnh báo bạn khi bạn gán lại một tham số phương thức cho một giá trị mới.