Ważne tylko dla JDK do 6
To nie jest błąd.
początkowa pojemność układu wewnętrznego stosowanego do przechowywania elementów listy jest naprawdę 10.
nie oznacza to, że wielkość listy jest 10. Tylko że pusta tablica o rozmiarze 10 jest tworzony.
Gdy obiekt zostanie dodany do listy, wewnętrzny wskaźnik do ostatniego elementu zostanie przeniesiony jeden raz. Jeśli pojemność tablicy jest niewystarczająca, tworzona jest inna tablica o większej pojemności, a stara tablica jest kopiowana w pierwszej części nowej tablicy. W tej chwili pojemność macierzy nie jest bardziej 10.
Kod jest:
public ArrayList() {
this(10); // Here the 10 of the default capacity
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
nowszych JDK (z Java 1.7)
Ważna uwaga: Tak, w nowszych wersjach ArrayList
(Myślę, że z Java7) kod źródłowy zmienił się na. Dokumentacja pozostaje stara:. Więc tak to błąd w dokumentacji!
Oto nowa wersja konstruktora
private static final Object[] EMPTY_ELEMENTDATA = {};
....
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA; // This is 0 capacity!!!!
}
UWAGA: Otworzyłem nowy błąd Oracle do przeglądu dokumentacji.
+1 Znalazłeś błąd w dokumentacji Java. Jak wyjaśniono w mojej odpowiedzi, nowy kod jest ważny z wersji Java 7, ale dokumentacja nie została zaktualizowana. –
Zależy, gdzie narysujesz linię. Równie dobrze można argumentować, że to leniwy inicjalizacji klasy. Zauważ, że tablica * no * jest przydzielona w domyślnym konstruktorze. – aioobe
Zaproponowałem nowy błąd firmie Oracle. Kiedy identyfikator błędu będzie dostępny, opublikuję go. –