all - Implementación de Java 8 Arraylist hugeCapacity(int)
print all elements arraylist java (2)
Estoy leyendo la documentación sobre cómo se ArrayList
s en Java. No entiendo por qué el hugeCapacity(int minCapacity)
elige devolver Integer.MAX_VALUE
o MAX_ARRAY_SIZE
.
De cómo se define MAX_ARRAY_SIZE
en la clase,
244 | private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
Es casi lo mismo que Integer.MAX_VALUE
excepto por el tamaño de un entero ( 32 bits
).
264 | private static int hugeCapacity(int minCapacity) {
265 | if (minCapacity < 0) // overflow
266 | throw new OutOfMemoryError();
267 | return (minCapacity > MAX_ARRAY_SIZE) ?
268 | Integer.MAX_VALUE :
269 | MAX_ARRAY_SIZE;
270 | }
¿Alguien puede decirme cuál es la diferencia sutil en devolver Integer.MAX_VALUE
versus MAX_ARRAY_SIZE
? De cualquier forma, ¿no OutOfMemoryError
ocurrir un OutOfMemoryError
?
Desde la implementación de Oracle (actualización de Java 8 31):
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
OutOfMemoryError
(2 31 - 1) - 8 para asegurarse de que su código no cree OutOfMemoryError
cuando lo ejecuta otra implementación de máquina virtual.
El tamaño máximo de la matriz está limitado a algún número que varía según las distintas JVM y, por lo general, es ligeramente inferior a Integer.MAX_VALUE
. OutOfMemoryError
la matriz de elementos Integer.MAX_VALUE
tendrá OutOfMemoryError
en la mayoría de las JVM, incluso si tiene suficiente memoria para hacerlo. MAX_ARRAY_SIZE
supone que es un tamaño de matriz válido en la mayoría de las JVM existentes. Entonces, cuando el tamaño de ArrayList
acerca a Integer.MAX_VALUE
(por ejemplo, tiene más de 1_500_000_000 elementos y necesita ampliar una matriz), se amplía a este MAX_ARRAY_SIZE
, por lo que se puede realizar con éxito (suponiendo que tiene suficiente memoria). Solo si el número de elementos supera MAX_ARRAY_SIZE
, ArrayList
intenta asignar una matriz de elementos Integer.MAX_VALUE
(que probablemente fallará en la mayoría de las JVM, pero puede tener éxito en algunas de ellas). De esta forma, puede agregar elementos de manera segura hasta MAX_ARRAY_SIZE
en casi cualquier JVM y solo después de eso tendrá problemas.