Có thể vì Map#values
trả lại chế độ xem các giá trị là được hỗ trợ bởi bản đồ.
Từ chính thức Java-Doc of Map#values:
Trả về một quan điểm Bộ sưu tập của các giá trị chứa trong bản đồ này. Bộ sưu tập được bản đồ sao lưu, vì vậy các thay đổi đối với bản đồ được phản ánh trong bộ sưu tập và ngược lại. [...] Bộ sưu tập hỗ trợ xóa phần tử, loại bỏ ánh xạ tương ứng khỏi bản đồ, qua Iterator.remove, Collection.remove, removeAll, retainAll và xóa các thao tác. Nó không hỗ trợ các hoạt động thêm hoặc addAll.
Lưu ý rằng lớp AbstractMap
, từ đó hầu hết các trường bản đồ mở rộng, có thêm một trường transient volatile Collection<V> values
và đó là chính xác những gì bạn sẽ đạt được điều đó. Khi bạn thấy bộ sưu tập được Bản đồ sử dụng nội bộ và do đó các thay đổi trên bản đồ cũng được phản ánh trên Bản đồ. Xem thêm: Source code of AbstractMap
Nếu bạn muốn đi vào chi tiết, hãy xem tại AbstractMap#values
phương pháp trong mã nguồn. Ở đó, họ tạo các giá trị là một trình bao bọc hoạt động trên bản đồ gốc. Ví dụ: phương thức next
lặp lại trên các mục Entry<K, V>
của Bản đồ nhưng chỉ trả về giá trị của chúng với Entry#getValue
và cứ tiếp tục như vậy.
Ngoài ra, phương pháp remove
, như bạn có thể thấy, được chuyển qua trình lặp của Entry<K, V>
, do đó việc xóa sẽ cuối cùng được thực thi trên bản đồ gốc một lần nữa.
Chỉ cần xác nhận, mã của bạn hoạt động nhưng bạn đang cố gắng hiểu tại sao. Chính xác? – shmosel
Có. Tôi đang cố tìm nguyên nhân gốc rễ. – caisil