Массив является примитивной структурой. Это последовательная память, выделенная JVM.
Arraylist использует массив позади него, но у вас нет прямого доступа к нему. Он может «расти», а обычный массив - нет.
По сути, arraylist начинается (по умолчанию) с массива длиной 10 и счетчиком 0. Итак, представьте, что у вас
ArrayList<Integer> myInts = new ArrayList<Integer>();
за этим стоит массив, подобный этому
count = 0
array = [ null, null, null, null, null, null, null, null, null, null ]
Когда вы идете myInts.add(5);
это делает
count = 1
array = [ 5, null, null, null, null, null, null, null, null, null ]
Если бы вы добавили больше, вы могли бы получить это
count = 10
array = [ 5, 4, 3, 2, 1, 5, 8, 3, 0, -1 ]
И если вы добавите еще один (который увеличит его емкость), он создаст новый массив для поддержки
count = 11
array = [ 5, 4, 3, 2, 1, 5, 8, 3, 0, -1, 9, null, null, null, null, null, null, null, null, null ]
Вы можете изменить размер резервного массива, если хотите. например:
myInts.trimToSize();
count = 11 // hasn't changed
array = [ 5, 4, 3, 2, 1, 5, 8, 3, 0, -1, 9]
myInts.ensureCapacity(15);
count = 11 // hasn't changed
array = [ 5, 4, 3, 2, 1, 5, 8, 3, 0, -1, 9, null, null, null, null,]