print all java arraylist

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.