Czytam dokumentację dotyczącą sposobu, w jaki są rozwijane ArrayList
w Javie. Nie rozumiem, dlaczego metoda hugeCapacity(int minCapacity)
decyduje się na zwrot: Integer.MAX_VALUE
lub MAX_ARRAY_SIZE
.Java 8 Arraylist Implementacja hugeCapacity (int)
Od jak MAX_ARRAY_SIZE
jest zdefiniowana w klasie
244 | private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
To prawie taka sama jak Integer.MAX_VALUE
except poza wielkością jednej liczby całkowitej (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 | }
Czy ktoś może mi powiedzieć, co jest subtelna różnica w powrocie Integer.MAX_VALUE
porównaniu MAX_ARRAY_SIZE
? Tak czy inaczej, czy nie powinien wystąpić błąd?
Odpowiedź jest tam w komentarzu powyżej MAX_ARRAY_SIZE: „Maksymalny rozmiar tablicy do przeznaczenia części maszyn wirtualnych rezerwę niektóre nagłówka słowa tablicy próbuje przydzielić większe tablice mogą spowodować OutOfMemoryError:.. Zamówiony rozmiar tablicy przekracza VM limit". Czyli: jeśli uda nam się uniknąć OutOfMemory na niektórych maszynach wirtualnych, w przeciwnym razie przydzielimy Integer.MAX_VALUE i odniesiemy sukces, jeśli będziecie mieli szczęście (w zależności od VM) –