Какие коллекции типа «ключ-значение» вы использовали в Java и в чём их различия?

«Какие коллекции типа «ключ-значение» вы использовали в Java и в чём их различия?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основные реализации интерфейса Map<K, V> в Java:

  • HashMap — хэш-таблица без гарантий порядка элементов. Допускает один null-ключ и множество null-значений. Не синхронизирована. Обеспечивает константное время O(1) для операций get() и put() в среднем случае.
  • LinkedHashMap — расширяет HashMap, сохраняя порядок вставки элементов (или порядок доступа, если используется режим access-order). Немного медленнее HashMap из-за поддержки связанного списка.
  • TreeMap — реализует интерфейс SortedMap. Хранит элементы в отсортированном порядке по ключам (на основе их натурального порядка или переданного Comparator). Основана на красно-чёрном дереве, операции get(), put() выполняются за O(log n).
  • Hashtable — устаревшая синхронизированная версия. Не допускает null-ключи или значения. Для многопоточности предпочтительнее использовать ConcurrentHashMap.
  • ConcurrentHashMap — высокопроизводительная, потокобезопасная реализация. Использует сегментирование блокировок (в более новых версиях — CAS-операции) для лучшего параллелизма.

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

Map<String, Integer> inventory = new HashMap<>();
inventory.put("apples", 50);
inventory.put("oranges", 30);
Integer appleCount = inventory.get("apples"); // 50
boolean hasBananas = inventory.containsKey("bananas"); // false

Выбор реализации:

  • Скорость и порядок не важенHashMap.
  • Нужен порядок вставки/доступаLinkedHashMap.
  • Требуется сортировка по ключуTreeMap.
  • ПотокобезопасностьConcurrentHashMap.