Вопрос с собеседования · Java

Нужна структура с быстрым поиском по ключу, которая при обходе отдаёт элементы в порядке их добавления. Что выбрать?

MiddleКоллекции
Коротко

LinkedHashMap: поиск по ключу O(1) и обход в порядке добавления.

  • HashMap — быстро, но порядок не определён
  • TreeMap — порядок по ключу, а не по времени, O(log n)
  • Список пар — линейный поиск

А ещё В многопоточном коде такого готового класса нет — синхронизация или ConcurrentHashMap + отдельная очередь

Подробно

HashMap даёт нужную скорость, но порядок обхода у него не определён и меняется при перехешировании. TreeMap упорядочивает по ключу, а не по времени добавления, и стоит O(log n). Список пар потребует линейного поиска. LinkedHashMap решает задачу точно: та же хеш-таблица плюс двусвязный список, прошивающий записи в порядке вставки. Общий подход к таким вопросам — сначала сформулировать паттерн доступа (поиск, обход, диапазоны, порядок), и структура выбирается почти однозначно.

Что хотят услышать

  • Выбор и сравнение с альтернативами.

Частые ошибки

  • Полагаться на порядок обхода HashMap: он не гарантирован.
  • Путать порядок вставки с сортировкой по ключу.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓LinkedHashMap
  • ✗TreeMap
  • ✗HashMap
  • ✗ArrayList пар ключ-значение

Что спросят дальше

  • Что изменится, если нужны ещё и запросы по диапазону ключей?
  • Какой ценой LinkedHashMap поддерживает порядок?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования