2015-11-13 14 views
10

Dokument JDK dla ArrayList constructor mówi, że początkowa pojemność to 10.Dokumentacja interfejsu API JDK jest niepoprawna dla konstruktora ArrayList. Czy to błąd?

Jest to w rzeczywistości błędne, ponieważ początkowa pojemność wynosi 0, dopóki coś nie zostanie dodane do listy. Sprawdziłem źródło Open JDK oraz plik src.zip dołączony do JDK.

Rozumiem, że jest to optymalizacja wydajności, ale czy zostanie to uznane za błąd?

+0

+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. –

+0

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

+0

Zaproponowałem nowy błąd firmie Oracle. Kiedy identyfikator błędu będzie dostępny, opublikuję go. –

Odpowiedz

7

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

spójrz na kod souce. Konstruktor 'ArrayList()' zawiera następujący wiersz: 'this.elementData = EMPTY_ELEMENTDATA;', z 'EMPTY_ELEMENTDATA' zdefiniowanym tutaj:' private static final Object [] EMPTY_ELEMENTDATA = {}; '. Pusta tablica nie ma rozmiaru 10, ale 0, jak OP powiedział – Paul

+0

Dodałem kod źródłowy ArrayList() i ArrayList (int initialCapacity) –

+2

Jaka to wersja? W 1.8 konstruktor jest zakodowany tak, jak wspomniałem w moim pierwszym komentarzu – Paul

1

To błąd w dokumentacji. Zapomnieli zaktualizować komentarz.

JDK 7:

public ArrayList() { 
    this(10); 
} 

JDK 8:

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
    super(); 
    this.elementData = EMPTY_ELEMENTDATA; 
} 
+1

'EMPTY_ELEMENTDATA' jest' Obiektem [] 'o rozmiarze 0. Początkowa pojemność wynosi 0, a nie 10. – Paul

+0

Stało się to gdzieś w jednej z drobnych aktualizacji JDK 7. Używam aktualizacji 75 JDK 7 i 10 nie jest obecny. –

+0

@AseemBansal - Widziałem tylko różnice między jdk7 i jdk8. – TheLostMind

0

od 1,7 Mówią, że ArrayList domyślnego rozmiaru 10 zostanie utworzony po dodaniu pierwszego elementu do niego .. to znaczy Obiekt ArrayList nie zostanie utworzony, dopóki nie dodasz do niego elementu, przeczytaj opis podany w zmiennej 'elementData' (Dowolny pusty ArrayList z elementData == EMPTY_ELEMENTDATA zostanie rozszerzony DEFAULT_CAPACITY {to jest zmienna wewnętrzna} po dodaniu pierwszego elementu .). To jak leniwa instancja.

W 1.6, nawet jeśli nie dodajemy elementu do ArrayList, to tworzymy 10 pustych obiektów, ich podobna gotowość do tworzenia instancji.

/** 
* Default initial capacity. 
*/ 
private static final int DEFAULT_CAPACITY = 10; 

/** 
* Shared empty array instance used for empty instances. 
*/ 
private static final Object[] EMPTY_ELEMENTDATA = {}; 


/* 
* The array buffer into which the elements of the ArrayList are stored. 
* The capacity of the ArrayList is the length of this array buffer. Any 
* empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded  
* DEFAULT_CAPACITY when the first element is added. 
*/ 

private transient Object[] elementData; 
/** 
* Constructs an empty list with an initial capacity of ten. (they might have forgot to update this..) 
*/ 
public ArrayList() { 
    super(); 
    this.elementData = EMPTY_ELEMENTDATA; 
} 
/*