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

Для чего служит интерфейс Iterator?

JuniorКоллекции
Ещё спрашивают так:
  • Что такое ConcurrentModificationException?
  • Как удалить элемент из коллекции во время обхода?
  • Как работает цикл for-each?
Коротко

Iterator даёт единый способ обойти коллекцию, не раскрывая её устройства: hasNext() и next().

  • for-each — синтаксический сахар над итератором
  • Удалять во время обхода — только iterator.remove() или removeIf

А ещё Изменение коллекции напрямую при обходе → ConcurrentModificationException (fail-fast)

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

Подробно

Интерфейс Iterator описывает последовательный обход: hasNext() — есть ли следующий элемент, next() — получить его, remove() — удалить последний полученный. Клиенту не важно, что внутри — массив, дерево или связный список.

Цикл for (T x : collection) компилятор разворачивает в получение итератора и вызовы hasNext() / next(). Работает для всего, что реализует Iterable.

Fail-fast. Итераторы стандартных коллекций (ArrayList, HashMap) запоминают счётчик изменений коллекции. Если коллекцию изменить мимо итератора — например, list.remove(x) внутри for-each — при следующем next() будет ConcurrentModificationException. Это защита от непредсказуемого результата, а не гарантия при многопоточности.

Как удалять правильно:

  • iterator.remove() в явном цикле с итератором;
  • collection.removeIf(predicate) — короче и понятнее;
  • собрать новую коллекцию через Stream.

Конкурентные коллекции (ConcurrentHashMap, CopyOnWriteArrayList) используют слабо согласованные итераторы, которые исключение не бросают.

Пример

List<Integer> nums = new ArrayList<>(List.of(1, 2, 3, 4));
// for (Integer n : nums) if (n % 2 == 0) nums.remove(n); // ConcurrentModificationException
nums.removeIf(n -> n % 2 == 0);                            // [1, 3]

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

  • Назначение итератора: единый обход без раскрытия устройства.
  • Связь с for-each.
  • ConcurrentModificationException и fail-fast.
  • Правильные способы удаления при обходе.

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

  • Удалять элементы через саму коллекцию внутри цикла for-each.
  • Считать, что обход как-то защищает коллекцию от параллельных изменений.

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

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

Показать варианты и ответ
  • ✓Даёт единый способ последовательно обойти элементы коллекции, не раскрывая её внутреннего устройства
  • ✗Сортирует элементы коллекции при обходе
  • ✗Копирует коллекцию перед обходом
  • ✗Делает коллекцию потокобезопасной на время обхода

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

  • Что произойдёт при изменении коллекции во время обхода?
  • Как корректно удалить элементы по условию?

Разбор темы

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

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

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

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

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