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

Чем ListIterator отличается от обычного Iterator?

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

ListIterator — только для списков: ход в обе стороны (hasPrevious, previous), индексы (nextIndex), изменение на месте — set и add.

  • set заменяет последний возвращённый элемент
  • add вставляет перед следующим
  • Для LinkedList — способ вставки за O(1) в найденную позицию

А ещё К потокобезопасности отношения не имеет

Подробно

ListIterator существует именно потому, что у списка есть позиция и порядок: он знает индексы (nextIndex, previousIndex), умеет ходить назад и изменять список по месту. Множества и карты позиции не имеют, поэтому там доступен только базовый Iterator. Тонкость, о которой стоит помнить: set заменяет элемент, возвращённый последним вызовом next или previous, а add вставляет перед элементом, который вернёт следующий next, — оба метода привязаны к текущей позиции курсора, и без предшествующего next вызов set бросит IllegalStateException.

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

  • Возможности сверх Iterator.

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

  • Пытаться получить ListIterator у Set.
  • Путать позицию вставки add с позицией замены set.

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

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Позволяет двигаться в обе стороны: hasPrevious() и previous()
  • ✓Умеет заменять элемент через set() и вставлять через add()
  • ✗Является потокобезопасным, в отличие от обычного Iterator, и не бросает ConcurrentModificationException
  • ✓Доступен только для List, но не для Set или Map

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

  • Куда именно вставляет add относительно курсора?
  • Каким итератором обходят конкурентные коллекции и чем он особенный?

Разбор темы

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

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

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

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

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