Я вважаю , що це, принаймні частково, дозволяють об'єднувати containsKey
і get
в один виклик. Якщо карта може містити нулі, немає способу визначити, чи get
повертає нуль, тому що для цього значення не було ключа або просто тому, що значення було нульовим.
Чому це проблема? Тому що немає безпечного способу зробити це самостійно. Візьміть наступний код:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Оскільки m
це паралельна карта, ключ k може бути видалений між викликами containsKey
та get
викликами, внаслідок чого цей фрагмент повертає нуль, який ніколи не був у таблиці, а не бажаний KeyNotPresentException
.
Зазвичай ви вирішите це шляхом синхронізації, але з одночасною картою, що, звичайно, не буде працювати. Отже, підпис для get
довелося змінити, і єдиним способом зробити це за допомогою сумісного ззаду способу було запобігти користувачеві вводити в першу чергу нульові значення та продовжувати використовувати це як заповнювач для "ключа не знайдено".