Entry sẽ không tìm lại được dù vẫn nằm trong map.
HashMap tính bucket một lần lúc put; nếu sau đó bạn đổi field tham gia hashCode(), giá trị hash mới trỏ sang bucket khác nên get() tìm nhầm chỗ.
java
List<String> ids = new ArrayList<>();
Map<List<String>, String> map = new HashMap<>();
map.put(ids, "value");
ids.add("x"); // hashCode của key vừa đổi
System.out.println(map.get(ids)); // null
System.out.println(map.size()); // 1 - entry vẫn còn đóHệ quả:
- get, containsKey, remove đều trả sai → entry chiếm bộ nhớ vĩnh viễn nhưng không xóa được (rò rỉ bộ nhớ ở mức logic).
- Duyệt entrySet() vẫn thấy entry đó, gây khác biệt khó hiểu giữa "tra cứu" và "duyệt".
- HashSet cũng vướng đúng vấn đề này vì nó dựa trên HashMap.
Javadoc của Map nói rõ phải rất cẩn trọng khi dùng object mutable làm key. Cách làm đúng: dùng key bất biến (String, Long, record toàn field final) hoặc lấy một field không đổi (thường là id) làm key.