Я полагаю, что это, по крайней мере частично, позволяет объединить containsKey
и get
в один вызов. Если карта может содержать нули, невозможно определить, возвращает ли get
ноль, потому что не было ключа для этого значения, или просто потому, что значение было нулевым.
Почему это проблема? Потому что нет безопасного способа сделать это самостоятельно. Возьмите следующий код:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Поскольку m
является одновременной картой, ключ k может быть удален между вызовами containsKey
и get
, в результате чего этот фрагмент кода возвращает ноль, которого никогда не было в таблице, вместо требуемого KeyNotPresentException
.
Обычно вы решаете это путем синхронизации, но с параллельной картой это, конечно, не сработает. Следовательно, подпись для get
должна была измениться, и единственный способ сделать это обратно-совместимым способом состоял в том, чтобы запретить пользователю вставлять нулевые значения в первую очередь, и продолжать использовать это в качестве заполнителя для «ключ не найден» .