1. Câu hỏi
2. Phân tích
Đây cũng là 1 câu hỏi khó, cần hiểu rõ về cách quản lý bộ nhớ, HEAP, STACK và cả hàm clone() của object
Giải thích theo hình bên trên.
-
ArrayList<Counter> original = new ArrayList<>(); => Tạo 1 ArrayList object [Giả thiết ở địa chỉ 15EE00] và biến 'original' trở đến địa chỉ này.
-
original.add(new Counter(10)); => Tạo 1 Counter object [Giả thiết ở địa chỉ 25AF06]. Set phần tử index 0 chỉ vào 25AF06.
-
ArrayList<Counter> cloned = (ArrayList<Counter>) original.clone(); => Xem chi tiết hàm clone của ArrayList
Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.)
original.clone() Tạo ra 1 Object mới, [Giả thiết ở địa chỉ 45BA12] và copy nội dung của ArrayList tại [15EE00].
Khi đó original != cloned nhưng original.get(0) == cloned.get(0). 4. cloned.get(0).count = 5; => cloned.get(0) tham chiếu đến 25AF06, khi đó cloned.get(0).count = 5; sẽ sửa giá trị tại vùng nhớ đó.
- System.out.println(original); Vì original vẫn dùng vùng nhớ {25AF06} nên sử dụng giá trị được update.
Đáp án:
3. Kết luận
Bạn có thể gõ code vào IDE để chạy lại và kiểm tra Source cho câu hỏi