Ответ
Теоретический максимум ограничен Integer.MAX_VALUE - 8 элементов, что составляет 2 147 483 639.
Объяснение: Внутренний массив ArrayList (Object[] elementData) индексируется по int. Максимальная длина массива в JVM ограничена значением Integer.MAX_VALUE (2^31 - 1 = 2 147 483 647). Однако, в некоторых реализациях JVM часть заголовка массива (header) может занимать до 8 байт, поэтому стандартные классы коллекций (как ArrayList) используют константу MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 в качестве практического предела для избежания проблем с выделением памяти.
Практическое ограничение: Даже с неограниченной RAM, вы можете столкнуться с OutOfMemoryError: Requested array size exceeds VM limit при попытке создать массив, длина которого приближается к Integer.MAX_VALUE.
Код, демонстрирующий предел:
// Внутри java.util.ArrayList
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// ...
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// ...
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // Переполнение int
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
Таким образом, ArrayList может вместить до Integer.MAX_VALUE элементов только в исключительном случае, когда JVM позволяет создать массив такой длины, но на практике безопасный предел — Integer.MAX_VALUE - 8.