Зависит ли временная сложность операции add() в ArrayList от количества элементов?

«Зависит ли временная сложность операции add() в ArrayList от количества элементов?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В среднем — нет (амортизированная O(1)), но в худшем случае — да (O(n)).

  • Большинство операций add(E element) выполняются за O(1), так как элемент добавляется в конец внутреннего массива.
  • Когда внутренний массив заполнен, происходит операция resize (увеличение capacity): создается новый массив большего размера (обычно старыйCapacity * 1.5), и все существующие элементы копируются в него. Эта операция имеет сложность O(n).

Практический пример:

// ArrayList с начальной capacity = 2
ArrayList<Integer> list = new ArrayList<>(2); 
list.add(1); // O(1) - добавление в массив
list.add(2); // O(1) - массив заполнен
list.add(3); // O(n)!
// Происходит resize: capacity становится 3, элементы 1 и 2 копируются.

Рекомендация: Если известен ожидаемый размер коллекции, задайте его в конструкторе ArrayList(int initialCapacity), чтобы минимизировать количество операций копирования.