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 "xin chào" (điều này là do tính bất biến của String phải không?).
Nhưng nó có thực sự an toàn khi sao chép Chuỗi bằng phương thức 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 thường), hoặc tốt hơn là viết điều này? :
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 trích này là gì?
EDIT - lý do tại sao đoạn trích đầu tiên an toàn:
Hãy để tôi giải thích mọi thứ chi tiết hơn một chút, dựa trên các câu trả lời hay đã được cung cấp (chủ yếu tập trung vào câu hỏi về sự khác biệt về hiệu suất giữa 2 đoạn):
Các chuỗi là bất biến trong Java, có nghĩa là một đối tượng Chuỗi không thể được sửa đổi sau khi xây dựng. Vì thế,
String s = "hello";tạo một cá thể String mới và gán địa chỉ của nó cho s( slà một tham chiếu đến cá thể / đối tượng)
String backup_of_s = s;tạo một biến mới backup_of_svà khởi tạo nó để nó tham chiếu đến đối tượng hiện được tham chiếu bởi s.
Lưu ý: Tính không thay đổi của chuỗi đảm bảo rằng đối tượng này sẽ không bị sửa đổi: bản sao lưu của chúng tôi an toàn
Lưu ý 2: Cơ chế thu gom rác Java đảm bảo rằng đối tượng này sẽ không bị hủy miễn là nó được tham chiếu bởi ít nhất một biến ( backup_of_strong trường hợp này)
Cuối cùng, s = "bye";tạo một thể hiện Chuỗi khác (vì tính bất biến, đó là cách duy nhất) và sửa đổi sbiến để bây giờ nó tham chiếu đến đối tượng mới.