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

Как выбираешь структуру данных под задачу? Проведи рассуждение на примере: нужно хранить сессии пользователей с быстрым поиском по id и обходом в порядке добавления.

MiddleКоллекции
Ещё спрашивают так:
  • Как выбрать коллекцию под задачу на собеседовании?
Коротко

Метод: какие операции горячие и как часто → сложность каждой у кандидатов → память и конкурентность. Поиск по id + обход в порядке добавления → LinkedHashMap; при доступе из многих потоков — ConcurrentHashMap плюс отдельная очередь порядка или синхронизация.

  • Сначала уточнить: размер, частота чтения и записи, нужен ли порядок, многопоточность
  • HashMap — поиск, но без порядка; ArrayList — порядок, но поиск O(n)
  • Сессии с истечением — Caffeine с expireAfterAccess

А ещё Ответ «зависит» без рассуждения не засчитают

Подробно

Алгоритм рассуждения:

  1. Какие операции: поиск по ключу, вставка, удаление, обход, диапазоны, минимум, порядок.
  2. Какие из них горячие и сколько элементов.
  3. Сложность операций у кандидатов.
  4. Память, конкурентный доступ, требования к порядку.

Пример — сессии пользователей: горячие операции — get по id и периодический обход в порядке создания (для истечения или отображения).

  • HashMap — get O(1), но порядок обхода не определён;
  • ArrayList — порядок есть, но поиск O(n);
  • TreeMap по id — порядок по id, а не по времени;
  • **LinkedHashMap** — get O(1) и обход в порядке вставки.

Многопоточность: сессии читают и пишут параллельно. Готового «ConcurrentLinkedHashMap» в JDK нет: ConcurrentHashMap для поиска плюс отдельная структура для порядка, или синхронизация, или кэш-библиотека. Для сессий с истечением на практике — Caffeine (expireAfterAccess, ограничение размера), а при нескольких экземплярах сервиса — Redis.

Хороший ответ показывает сам ход рассуждения и вопросы, а не заученную таблицу.

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

  • Рассуждение от операций к сложности.
  • Сравнение кандидатов.
  • Учёт многопоточности и практическое решение.

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

  • Называть структуру без обоснования.

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

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

Показать варианты и ответ
  • ✓LinkedHashMap — поиск O(1) и порядок вставки
  • ✗ArrayList — порядок добавления сохраняется, а поиск по id быстрый
  • ✗TreeMap — он хранит элементы отсортированными по ключу, а значит, и в порядке добавления
  • ✗HashMap — поиск быстрый, а порядок совпадает с порядком вставки

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

  • Что изменится, если понадобится выбирать сессии в диапазоне времени?
  • Когда массив лучше любой коллекции?

Разбор темы

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

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

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

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

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