Thứ nhất, bạn không bao giờ đặt đối tượng thành không. Khái niệm đó không có ý nghĩa. Bạn có thể chỉ định giá trị null
cho một biến số , nhưng bạn cần phân biệt giữa các khái niệm "biến" và "đối tượng" rất cẩn thận. Khi bạn thực hiện, câu hỏi của bạn sẽ tự trả lời chính xác :)
Hiện tại về "bản sao nông" và "bản sao sâu" - có thể đáng để tránh cụm từ "bản sao nông" ở đây một đối tượng mới, nhưng chỉ cần sao chép trực tiếp các trường của đối tượng hiện có. Một bản sao sâu cũng sẽ lấy một bản sao của các đối tượng được các trường đó nhắc đến (đối với các trường kiểu tham chiếu). Một nhiệm vụ đơn giản như thế này:
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = list1;
... không làm hoặc một bản sao cạn hoặc một bản sao sâu trong ý nghĩa đó. Nó chỉ sao chép tham chiếu. Sau mã ở trên, list1
và list2
là các biến độc lập - chúng chỉ xảy ra có cùng giá trị (tham chiếu) tại thời điểm này. Chúng ta có thể thay đổi giá trị của một trong số họ, và nó sẽ không ảnh hưởng đến người khác:
list1 = null;
System.out.println(list2.size()); // Just prints 0
Bây giờ nếu thay vì thay đổi biến, chúng tôi thực hiện thay đổi đối tượng mà giá trị của các biến tham khảo , sự thay đổi đó sẽ được hiển thị thông qua biến khác quá:
list2.add("Foo");
System.out.println(list1.get(0)); // Prints Foo
Vì vậy, trở lại câu hỏi ban đầu của bạn - bạn không bao giờ lưu trữ đối tượng thực tế trong một bản đồ, danh sách, mảng vv bạn chỉ bao giờ lưu trữ tài liệu tham khảo .Một đối tượng chỉ có thể được thu thập rác khi không có cách nào để "sống" mã tiếp cận đối tượng đó nữa. Vì vậy, trong trường hợp này:
List<String> list = new ArrayList<String>();
Map<String, List<String>> map = new HashMap<String, List<String>>();
map.put("Foo", list);
list = null;
... đối tượng ArrayList
vẫn có thể không được thu gom rác thải, bởi vì Map
có một mục trong đó đề cập đến nó.
tôi luôn luôn tìm thấy một trong những khía cạnh hấp dẫn nhất của Java là thu gom rác ... –