Tôi tin rằng, ít nhất là một phần, cho phép bạn kết hợp containsKeyvà thực hiện getmột cuộc gọi. Nếu bản đồ có thể giữ null, không có cách nào để biết liệu getcó trả về null hay không vì không có khóa cho giá trị đó hoặc chỉ vì giá trị là null.
Tại sao đó là một vấn đề? Bởi vì không có cách nào an toàn để làm điều đó cho mình. Lấy mã sau:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Vì mlà bản đồ đồng thời, khóa k có thể bị xóa giữa các cuộc gọi containsKeyvà getcuộc gọi, khiến đoạn mã này trả về một giá trị không bao giờ có trong bảng, thay vì mong muốn KeyNotPresentException.
Thông thường bạn sẽ giải quyết điều đó bằng cách đồng bộ hóa, nhưng với một bản đồ đồng thời tất nhiên sẽ không hoạt động. Do đó, chữ ký getphải thay đổi và cách duy nhất để làm điều đó theo cách tương thích ngược là ngăn người dùng chèn giá trị null vào vị trí đầu tiên và tiếp tục sử dụng nó như một trình giữ chỗ cho "không tìm thấy khóa".