Где в памяти хранятся ссылки на элементы ArrayList?

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

Ответ

Ссылки на объекты, добавленные в ArrayList, хранятся во внутреннем массиве Object[] elementData, который располагается в куче (Heap).

Как это работает:

  1. При создании ArrayList внутри инициализируется массив elementData (по умолчанию пустой или заданной начальной емкости).
  2. Метод add(E e) помещает ссылку на объект e в следующую свободную ячейку этого массива.
  3. При заполнении массива создается новый массив большего размера (обычно старый_размер * 1.5), в него копируются все старые ссылки, и elementData начинает указывать на новый массив.

Пример:

ArrayList<String> list = new ArrayList<>();
list.add("Hello"); // Ссылка на строковый объект "Hello" сохраняется в elementData[0]
list.add("World"); // Ссылка сохраняется в elementData[1]

Важные нюансы:

  • ArrayList хранит только ссылки. Сами объекты лежат отдельно в куче.
  • Для примитивных типов (например, int) происходит автоупаковка (boxing) в объекты-обертки (Integer), и в массив помещается ссылка на этот объект-обертку.
  • Удаление элемента (remove) устанавливает null в соответствующей ячейке массива и сдвигает последующие элементы, что может быть затратной операцией O(n).