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

Сколько стоит удаление элемента из середины ArrayList и почему?

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

O(n): хвост сдвигается влево через System.arraycopy, последняя ячейка обнуляется. Удаление в цикле — квадратичная работа.

  • Удаление с конца — O(1)
  • Много удалений — removeIf: один проход и один сдвиг
  • Удалять по индексу вперёд в цикле — пропуск соседних элементов

А ещё Порядок не важен — поменять с последним и удалить последний за O(1)

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

Попробуйте сами

Сколько раз ArrayList копирует массив

Подробно

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

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

  • Сдвиг хвоста и сложность.
  • Последствия для удаления в цикле и removeIf.

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

  • Удалять в цикле по возрастающему индексу и пропускать элементы.
  • Строить алгоритм на массовом удалении из середины списка.

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

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

Показать варианты и ответ
  • ✓O(n): все элементы правее сдвигаются влево через System.arraycopy
  • ✗O(1): на месте элемента остаётся null-дырка
  • ✗O(log n): используется двоичный поиск позиции
  • ✗O(1) амортизированно, как и добавление в конец

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

  • Почему removeIf эффективнее серии remove?
  • Чем в этом сценарии поможет другая структура данных?

Разбор темы

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

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

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

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

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