Чем ListIterator отличается от обычного Iterator?
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 относительно курсора?
- Каким итератором обходят конкурентные коллекции и чем он особенный?
Разбор темы
- Итераторы: fail-fast и ConcurrentModificationException
Iterator и ListIterator, механизм modCount, причины CME даже в одном потоке и безопасное удаление.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.