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