2016-08-15 16 views
6

ArrayList#get, set i najpierw wywołaj metodę rangeCheck. Ta metoda nie sprawdza, czy indeks jest ujemny. Sprawdza tylko, czy indeks jest większy lub równy długości tablicy. Javadoc wyjaśnia przyczynę; dostęp do tablicy wyrzuca ArrayIndexOutOfBoundsException, jeśli indeks jest ujemny.Dlaczego ArrayList # rangeCheck nie sprawdza, czy indeks jest ujemny?

private void rangeCheck(int index) { 
    if (index >= size) 
     throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); 
} 
public E get(int index) { 
    rangeCheck(index); 

    return elementData(index); 
} 

Według Java Langauage Specification An dostęp do tablicy zgłasza ArrayIndexOutOfBoundsException jeśli indeks jest nie tylko negatywne, ale również GTE.

Dostęp do wszystkich tablic jest sprawdzany w czasie wykonywania; próba użycia indeksu , która jest mniejsza niż zero lub większa lub równa długości tablicy powoduje wygenerowanie wyjątku ArrayIndexOutOfBoundsException.

Myślę, że funkcja rangeCheck powinna sprawdzać zarówno wartość ujemną, jak i parametr gte, a dla wydajności nie powinna sprawdzać. Dlaczego funkcja rangeCheck nie sprawdza, czy indeks jest ujemny?

+4

Ponieważ nie musi. Później dostęp do macierzy już to robi. Jak mówi twój cytat. – EJP

Odpowiedz

10

Po prostu dlatego, że w tablicy ArrayList może być większa niż bieżący rozmiar.

W obecnej implementacji pojemność macierzy dyskowej ArrayList zwiększa się o współczynnik 1,5 za każdym razem, gdy zostanie przekroczona maksymalna pojemność. Domyślna początkowa pojemność to 10, a gdy spróbujesz dodać 11 element do listy, tablica zostanie ponownie przydzielona z pojemnością 15. Kiedy przekroczysz 15, przejdziesz do 22, itd.

W dowolnym momencie, pojemność jest prawdopodobnie większa niż obecna liczba elementów w ArrayList.

Sprawdzanie indeksów ujemnych pozostawia się JVM (w macierzy), a sama ArrayList musi sprawdzać tylko na górnym końcu bieżącej listy.

+0

["Szczegóły polityki wzrostu nie są określone poza faktem, że dodanie elementu ma stały zamortyzowany koszt czasu"] (https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList .html). – EJP

+0

Nie, nie jesteś. Opisujesz 'Vector'. Obecna implementacja 'ArrayList' rośnie 1,5-krotnie. – EJP

+0

Masz rację, minęło trochę czasu, odkąd wyglądałem w grepcode. A może mylę to z przyrostem dla tablicy kubełkowej w 'HashMap'. Edytowane ponownie. –

Powiązane problemy