Что такое Map в Java и каковы его основные реализации?

Ответ

java.util.Map<K, V> — интерфейс коллекции, хранящей пары ключ-значение. Ключи уникальны, каждому ключу соответствует ровно одно значение.

Основные реализации и их особенности:

Реализация Порядок итерации Временная сложность (get/put) Особенности
HashMap Не гарантирован O(1) в среднем Наиболее распространённая. Использует хэш-таблицу. Допускает null ключ и значения. Не потокобезопасна.
LinkedHashMap По порядку добавления (или порядку доступа) O(1) Расширяет HashMap, сохраняя порядок элементов через двусвязный список. Полезно для LRU-кэшей.
TreeMap По отсортированному порядку ключей O(log n) Реализует NavigableMap. Ключи сортируются по их натуральному порядку (Comparable) или переданному Comparator.
ConcurrentHashMap Не гарантирован O(1) в среднем Потокобезопасная реализация для многопоточных сред. Высокая производительность за счёт блокировок на уровне сегментов/бакетов.

Пример использования HashMap:

Map<String, Integer> fruitBasket = new HashMap<>();
// Добавление пар
fruitBasket.put("apples", 5);
fruitBasket.put("oranges", 3);
// Получение значения по ключу
Integer appleCount = fruitBasket.get("apples"); // 5
// Проверка наличия ключа
boolean hasBananas = fruitBasket.containsKey("bananas"); // false
// Итерация по записям
for (Map.Entry<String, Integer> entry : fruitBasket.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

Типичные сценарии: кэширование, подсчёт частоты элементов, хранение конфигураций, реализация словарей.

Ответ 18+ 🔞

Давай разберём эту вашу карту, но не географическую, а java.util.Map<K, V>. Представь себе, блядь, такой волшебный ящик, куда ты кидаешь ключ, а он тебе выдает ровно одну штуку, привязанную к этому ключу. Два ключа одинаковых — нихуя не получится, он тебе мозги вынесет. Уникальность, мать её, святое.

А вот и семейка этих ящиков, каждый со своим характером, ёпта:

Реализация Как лежит барахло Скорость (достать/положить) Особый прикол
HashMap Как попало, блядь O(1) в среднем (быстро как хуй с горы) Самый популярный урод. Внутри хэш-таблица. Может хранить null и ключ, и значение. Но если с разных потоков лезть — будет пиздец и ConcurrentModificationException.
LinkedHashMap В порядке, как клал O(1) Тот же HashMap, но с памятью, как у слона. Помнит, что за чем положили. Идеален, чтобы сделать кэш, который выкидывает то, чем давно не пользовались.
TreeMap Аккуратно, по порядку O(log n) (медленнее, но упорядоченно) Любитель дисциплины. Сам сортирует ключи — либо как они умеют (Comparable), либо как ему скажешь (Comparator). Внутри красно-чёрное дерево, если что.
ConcurrentHashMap Как попало O(1) в среднем Боевой братан для многопоточки. Позволяет всем хулиганам работать с собой одновременно, не устроив дерибан. Умный, блокирует не всю таблицу, а только кусок.

Смотри, как HashMap в деле, на примере корзины с фруктами:

Map<String, Integer> fruitBasket = new HashMap<>();
// Закидываем фрукты
fruitBasket.put("apples", 5);
fruitBasket.put("oranges", 3);
// Достаём, что положили
Integer appleCount = fruitBasket.get("apples"); // вернёт 5, если не проёбан
// Проверяем, не проёбали ли мы бананы
boolean hasBananas = fruitBasket.containsKey("bananas"); // false, нихуя нет бананов
// Перебираем всё, что наворотили
for (Map.Entry<String, Integer> entry : fruitBasket.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

Где это всё впаривают? Да везде, сука: кэшируют дорогие вычисления, считают, сколько раз какое слово встретилось, хранят настройки, делают из себя словари — овердохуища применений. Главное — ключ не потеряй, а то нихуя не достанется.