Во сколько раз увеличивается емкость ArrayList при заполнении наполовину?

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

Ответ

В стандартной реализации ArrayList в Java (OpenJDK) емкость увеличивается в 1.5 раза при необходимости расширения.

Как это работает: При добавлении элемента, если внутренний массив заполнен, вызывается метод grow(). Новая емкость вычисляется по формуле:

int newCapacity = oldCapacity + (oldCapacity >> 1); // Эквивалентно oldCapacity * 1.5

Пример:

ArrayList<Integer> list = new ArrayList<>(10); // Начальная емкость = 10
// Добавляем 10 элементов (емкость заполнена)
// При попытке добавить 11-й элемент происходит расширение:
// Новая емкость = 10 + (10 >> 1) = 10 + 5 = 15

Почему именно 1.5? Это компромисс между:

  • Производительностью: Уменьшает частые и дорогие операции копирования данных в новый массив.
  • Памятью: Ограничивает избыточное выделение неиспользуемой памяти (в сравнении, например, с увеличением в 2 раза).