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.