Получить доступ

Что произойдёт при обходе LinkedHashMap, созданного с accessOrder = true, если во время итерации вызвать get() по существующему ключу?

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

В режиме accessOrder даже get переносит запись в конец — это структурная модификация, итератор бросит ConcurrentModificationException.

  • В режиме порядка вставки get и замена значения безопасны
  • Документированное, но неожиданное поведение
  • Обходить с чтением — копия ключей или режим вставки

А ещё Особенно коварно в LRU-кэше с логированием при обходе

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Неожиданная, но задокументированная деталь: в режиме порядка доступа get перемещает запись в конец списка, что для итератора неотличимо от изменения структуры. В режиме порядка вставки (по умолчанию) такой проблемы нет — там структурной модификацией считается только добавление или удаление, а замена значения по существующему ключу безопасна. Практический вывод для LRU-кэша: не вызывайте get внутри цикла обхода той же карты, а если нужно снять срез, сначала скопируйте ключи.

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

  • Почему get — структурное изменение в accessOrder.

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

  • Считать любой get безопасным во время итерации.
  • Забывать, что в режиме вставки put по существующему ключу структурной модификацией не является.

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

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

Показать варианты и ответ
  • ✓Это структурная модификация порядка, и итератор бросит ConcurrentModificationException
  • ✗Ничего особенного: get не меняет коллекцию
  • ✗Итерация начнётся заново с первого элемента
  • ✗Запись будет удалена из карты

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

  • Что вообще считается структурной модификацией карты?
  • Как безопасно снять снимок содержимого во время активной работы с картой?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем