Что такое Map в Java
Что проверяют
Знаете ли вы, что это интерфейс, и различаете ли реализации по гарантиям.
Как отвечать
Map это интерфейс отображения ключей в значения. Ключи уникальны, каждому соответствует не больше одного значения. В иерархию Collection он не входит, стоит отдельно.
Реализации и их гарантии:
- HashMap: хеш-таблица, доступ в среднем за постоянное время, порядок не определён. Допускает один
null-ключ. Реализация по умолчанию; - LinkedHashMap: то же плюс порядок вставки (или обращения, что позволяет собрать LRU-кэш переопределением
removeEldestEntry); - TreeMap: красно-чёрное дерево, ключи отсортированы, операции за логарифм, есть навигационные методы (
floorKey,ceilingKey,subMap).null-ключ не допускается; - ConcurrentHashMap: потокобезопасная, чтение без блокировок, запись блокирует часть таблицы.
nullни в ключах, ни в значениях; - EnumMap: массив под капотом, когда ключи это перечисление. Самая быстрая и компактная в своём случае.
Полезные методы современного интерфейса: getOrDefault, putIfAbsent, computeIfAbsent (ленивая инициализация значения), merge (счётчики в одну строку), forEach.
Требование к ключу: корректные equals и hashCode и неизменяемость по этим полям. Изменение ключа после вставки делает значение недостижимым.
Где спотыкаются
Говорят, что Map наследует Collection.
Кладут в ConcurrentHashMap null и получают исключение.
Делают «проверить и положить» двумя вызовами на конкурентной карте и получают гонку.
Не знают про computeIfAbsent и пишут громоздкие проверки.