Sto leggendo la documentazione su come vengono sviluppati i ArrayList
s in Java. Non capisco perché il metodo hugeCapacity(int minCapacity)
scelga di restituire Integer.MAX_VALUE
o MAX_ARRAY_SIZE
.Java 8 Arraylist implementazione enormeCapacity (int)
Da come MAX_ARRAY_SIZE
è definito nella classe,
244 | private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
È quasi uguale Integer.MAX_VALUE
tranne fuori dalle dimensioni di un intero (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 | }
Qualcuno può dirmi che cosa la sottile differenza è nel ritorno contro Integer.MAX_VALUE
MAX_ARRAY_SIZE
? In entrambi i casi, non dovrebbe verificarsi un OutOfMemoryError
?
La risposta è proprio lì nel commento sopra MAX_ARRAY_SIZE: "La dimensione massima dell'array da allocare Alcuni riserva VM alcuni parole intestazione in un array tenta di allocare matrici più grandi possono provocare OutOfMemoryError:.. Dimensione dell'array richiesta oltrepassa VM limite". Significato: Se possiamo evitare OutOfMemory su alcune macchine virtuali, altrimenti assegneremo Integer.MAX_VALUE e riusciremo se sarai fortunato (a seconda della VM) –