Tôi tin rằng, ít nhất là một phần, cho phép bạn kết hợp containsKey
và thực hiện get
một cuộc gọi. Nếu bản đồ có thể giữ null, không có cách nào để biết liệu get
có 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ì m
là bản đồ đồng thời, khóa k có thể bị xóa giữa các cuộc gọi containsKey
và get
cuộ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ý get
phả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".