Что лежит в основе ArrayList?
- Как устроен ArrayList?
- Какая сложность операций у ArrayList?
- Как ArrayList увеличивает размер?
В основе — массив, который при заполнении заменяется большим с копированием элементов (примерно в 1,5 раза).
- get по индексу — O(1), add в конец — амортизированно O(1)
- Вставка и удаление в середине — O(n): элементы сдвигаются
А ещё Если размер известен заранее — задайте ёмкость в конструкторе
Подробно
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.
- Совет про начальную ёмкость — плюс.
Частые ошибки
- Ожидать дешёвого удаления из середины.
- Путать внутреннее устройство со связным списком.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Двусвязный список узлов, как у LinkedList, но с индексом
- ✗Хеш-таблица с бакетами
- ✗Сбалансированное дерево
- ✓Массив, который при заполнении копируется в больший
Что спросят дальше
- Почему добавление в конец считают амортизированно константным?
- Когда стоит задать начальную ёмкость?
Разбор темы
- ArrayList: динамический массив изнутри
Бэкенд-массив, рост в 1.5×, амортизированная O(1), стоимость вставки/удаления и когда массив лучше.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.