Безопасна ли операция обращение к HashMap по несуществующему ключу

Ответ

Обращение к HashMap по несуществующему ключу безопасно - метод get() вернет null. Однако важно учитывать:

  1. Если значение null было явно сохранено по ключу, get() также вернет null, что может ввести в заблуждение
  2. Для проверки существования ключа лучше использовать containsKey()
  3. В Kotlin есть безопасный оператор ?. и getOrDefault()

Пример:

val map = hashMapOf("a" to 1)
println(map["b"]) // null
println(map.containsKey("b")) // false
println(map.getOrDefault("b", 0)) // 0

Ответ 18+ 🔞

А, ну это классика, ёпта! Смотри, с HashMap'ом вообще прикол — если ты лезешь за ключом, которого нет, он тебе просто null вернёт, и никакой паники. Типа, "извини, братан, тут такого нет, держи пустоту".

Но вот тут, блядь, и начинается самое интересное, потому что null — он как хитрая жопа: он может означать две совершенно разные вещи. Первое — ключа реально нет, карта его не знает. А второе — ключ-то есть, но по нему специально положили этот самый null. И как их отличить? Вот это уже, ядрёна вошь, задача со звёздочкой.

Поэтому, если тебе прям принципиально знать, есть ключ или его нет, а не просто получить значение, то надо использовать containsKey(). Это как спросить у карты: "Слушай, а ты такого чувака в принципе знаешь?" Она честно ответит: да или нет. Без этих вот "ну, типа, держи null, а там сам разбирайся".

В Kotlin, кстати, вообще красота — там можно не париться. Либо через безопасный вызов ?., который просто сдохнет, если null, либо через getOrDefault(), который, если ключа нет, тебе дефолтное значение подкинет. Удобно, как блин!

Вот, смотри на пример, тут всё понятно станет:

val map = hashMapOf("a" to 1)
println(map["b"]) // null — потому что "b" нет, и волнение ебать не надо
println(map.containsKey("b")) // false — карта прямо говорит: нету, иди на хуй
println(map.getOrDefault("b", 0)) // 0 — раз нет ключа, держи ноль, не пропадать же добру

Короче, главное — понимать, что null от get() это не ошибка, а нормальная реакция на "не нашёл". Но если хочешь быть точным, как швейцарские часы, то containsKey() твой лучший друг. Всё просто, как три копейки.