String s = "hello";
String backup_of_s = s;
s = "bye";
Tại thời điểm này, biến dự phòng vẫn chứa giá trị ban đầu "hello" (điều này là do quyền không thay đổi của String?).Tôi nên sao chép Strings bằng Java như thế nào?
Nhưng thực sự là an toàn để sao chép chuỗi bằng phương pháp này (tất nhiên là không an toàn để sao chép các đối tượng có thể thay đổi thường xuyên) hay viết tốt hơn? :
String s = "hello";
String backup_of_s = new String(s);
s = "bye";
Nói cách khác, sự khác biệt (nếu có) giữa hai đoạn mã này là gì?
EDIT - lý do tại sao đoạn đầu tiên là an toàn:
Hãy để tôi chỉ giải thích điều này với một chi tiết nhỏ hơn, dựa trên câu trả lời tốt đã cung cấp (trong đó chủ yếu được tập trung vào các câu hỏi sự khác biệt về hiệu suất giữa 2 đoạn mã):
Chuỗi không thay đổi trong Java, điều này có nghĩa là đối tượng String không thể sửa đổi sau khi xây dựng. Do đó,
String s = "hello";
tạo một String dụ mới và gán địa chỉ của nó để s
(s
là một tham chiếu đến dụ/object)
String backup_of_s = s;
tạo ra một biến mới backup_of_s
và khởi tạo nó để nó tham chiếu đến đối tượng hiện được tham chiếu bởi s
.
Lưu ý: String tính bất biến đảm bảo rằng đối tượng này sẽ không được sửa đổi: sao lưu của chúng tôi là an toàn
Note 2: Java thu gom rác thải cơ chế đảm bảo rằng đối tượng này sẽ không bị hủy diệt miễn là nó được tham chiếu bởi ít nhất một biến (backup_of_s
trong trường hợp này)
Cuối cùng, s = "bye";
tạo một thể hiện String khác (vì bất biến, đó là cách duy nhất), và sửa đổi biến s
để nó tham chiếu đối tượng mới.
Tính bất biến không liên quan gì đến nó. Nó chỉ đơn giản là cách tham chiếu đối tượng hoạt động. Tôi có thể cung cấp một ví dụ StringBuilder tương đương. – GriffeyDog
@BalusC, tôi không thể thấy cách String mới() có thể tạo bất kỳ thứ gì trong nhóm Chuỗi của JVM. Chỉ có các chuỗi rác và những người được cam kết vào hồ bơi thông qua thực tập() có trong hồ bơi. – Snicolas
@GriffeyDog: Tôi đọc câu hỏi ít theo nghĩa đen. Những gì tôi đang nói là an toàn để đưa ra các tham chiếu đến một đối tượng chuỗi mà không sợ rằng ai đó có thể sửa đổi chuỗi. – NPE