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

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

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

Корректно: removeIf, явный Iterator.remove(), проход по индексам с конца. Удаление в for-each — CME, по индексам вперёд — пропуск элементов.

  • removeIf на ArrayList — один сдвиг хвоста, а не на каждое удаление
  • iterator.remove синхронизирует ожидаемый modCount
  • Новый список через stream().filter() — тоже вариант

А ещё Для Map — entrySet().removeIf или values().removeIf

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

Подробно

Метод iterator.remove() работает потому, что итератор сам синхронизирует свой ожидаемый счётчик модификаций с коллекцией. removeIf — самый читаемый вариант и в реализациях на массиве ещё и эффективнее серии удалений, так как сдвигает хвост один раз, а не на каждый элемент. Обход по индексам с конца корректен потому, что удаление сдвигает только элементы правее текущего, которые уже обработаны. Прямое удаление через коллекцию внутри for-each — та самая ошибка, дающая ConcurrentModificationException.

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

  • Перечень корректных способов и почему они работают.

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

  • Идти по индексам вперёд и удалять — каждый второй элемент будет пропущен.
  • Вызывать iterator.remove() до первого next() — получите IllegalStateException.

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

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

Показать варианты и ответ
  • ✓collection.removeIf(predicate)
  • ✓Явный Iterator и вызов iterator.remove()
  • ✓Обход списка по индексам с конца к началу
  • ✗for-each с вызовом collection.remove(element)

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

  • Почему removeIf эффективнее серии remove у ArrayList?
  • Что вернёт stream().filter() — изменит ли он исходную коллекцию?

Разбор темы

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

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

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

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

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