Technicznie rzecz biorąc, nie jest 10
to zero, jeśli przyznajesz się do leniwej inicjalizacji tablicy bazowej. Widzieć:
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
gdzie
private static final int DEFAULT_CAPACITY = 10;
To, o czym mówisz, to po prostu początkowy obiekt tablicy o zerowej wielkości, który jest współdzielony przez wszystkie początkowo puste ArrayList
obiekty. To 10
znaczy pojemność jest leniwie gwarantowana , optymalizacja obecna również w Javie 7.
Trzeba przyznać, że umowa z wykonawcą nie jest do końca dokładna. Być może to jest tutaj źródłem nieporozumień.
tło
Oto e-mail od Mike'a Duigou
Wysłałem zaktualizowaną wersję pustej łatki ArrayList i HashMap.
http://cr.openjdk.java.net/~mduigou/JDK-7143928/1/webrev/
Ta poprawiona implementacja nie wprowadza żadnych nowych dziedzin do żadnej z klas. W przypadku ArrayList opóźnione przydzielanie tablicy zapasowej występuje tylko wtedy, gdy lista jest tworzona z domyślnym rozmiarem. Według naszego zespołu ds. Analizy wydajności około 85% instancji ArrayList jest tworzonych w domyślnym rozmiarze, więc ta optymalizacja będzie obowiązywać w przytłaczającej większości przypadków.
W przypadku HashMap, pole progowe jest wykorzystywane w kreacji do śledzenia żądanego rozmiaru początkowego do momentu, gdy będzie potrzebna tablica zasobnika. Po stronie odczytu pusty przypadek mapy jest testowany za pomocą isEmpty (). W przypadku rozmiaru zapisu porównanie (table == EMPTY_TABLE) jest używane w celu wykrycia potrzeby wypełnienia tablicy bucket. W readObject jest trochę więcej pracy, aby spróbować wybrać wydajną pojemność początkową.
Od: http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-April/015585.html