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

Что лежит в основе ArrayList?

JuniorКоллекции
Ещё спрашивают так:
  • Как устроен ArrayList?
  • Какая сложность операций у ArrayList?
  • Как ArrayList увеличивает размер?
Коротко

В основе — массив, который при заполнении заменяется большим с копированием элементов (примерно в 1,5 раза).

  • get по индексу — O(1), add в конец — амортизированно O(1)
  • Вставка и удаление в середине — O(n): элементы сдвигаются

А ещё Если размер известен заранее — задайте ёмкость в конструкторе

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

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

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

Подробно

ArrayList хранит элементы во внутреннем массиве elementData. Размер списка (size) обычно меньше длины массива (ёмкости) — есть запас.

Из устройства следуют характеристики:

  • доступ по индексу — O(1): адрес вычисляется арифметически;
  • добавление в конец — обычно O(1). Когда массив заполнен, создаётся новый большего размера (в HotSpot — примерно в 1,5 раза) и элементы копируются. Копирование дорогое, но редкое, поэтому в среднем по серии операций добавление — амортизированное O(1);
  • вставка и удаление в середине — O(n): все элементы правее нужно сдвинуть;
  • поиск по значению (contains, indexOf) — O(n).

Практика: если размер известен, передать ёмкость в конструктор (new ArrayList<>(10_000)) — расширений не будет. Массив сам не уменьшается при удалении: для этого есть trimToSize().

ArrayList не потокобезопасен.

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

  • Динамический массив и механизм расширения с копированием.
  • Сложность основных операций, амортизированное O(1) для add.
  • Совет про начальную ёмкость — плюс.

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

  • Ожидать дешёвого удаления из середины.
  • Путать внутреннее устройство со связным списком.

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

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

Показать варианты и ответ
  • ✓Массив, который при заполнении заменяется на больший с копированием элементов
  • ✗Двусвязный список узлов
  • ✗Хеш-таблица с бакетами
  • ✗Сбалансированное дерево

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

  • Почему добавление в конец считают амортизированно константным?
  • Когда стоит задать начальную ёмкость?

Разбор темы

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

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

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

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

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