Ответ
Ссылки на объекты, добавленные в ArrayList, хранятся во внутреннем массиве Object[] elementData, который располагается в куче (Heap).
Как это работает:
- При создании
ArrayListвнутри инициализируется массивelementData(по умолчанию пустой или заданной начальной емкости). - Метод
add(E e)помещает ссылку на объектeв следующую свободную ячейку этого массива. - При заполнении массива создается новый массив большего размера (обычно
старый_размер * 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).