2013-08-23 13 views
9

Dlaczego LinkedList i ArrayList rozszerza AbstractList w Java?Dlaczego lista_połączeń i lista tablicowa rozszerzają listę składników AbstractList w języku Java?

Klasy abstrakcyjne są używane, gdy chcemy określić typowe zachowanie w klasach implementacji.

Ale wszystkie metody, które są w AbstractList, są zastępowane przez ArrayList i LinkedList.

Więc jaki jest pożytek z rozszerzenia tej klasy?

+0

[Opis najwyższego poziomu klasy] (http://docs.oracle.com/javase/7/docs/api/java/util/AbstractList.html) wydaje mi się wystarczający. Ponieważ 'ArrayList' i' LinkedList' mają różne podkłady, oczekiwałbym, że będą wdrażać pewne metody w inny sposób. – Makoto

+2

LinkedList rozszerza listę AbstractList w Javie (1.6). Rozszerza AbstractSequentialList – Jayan

+0

Abstrakcja nie tylko rozszerza typowe zachowanie. Ma również na celu ustanowienie relacji między ściśle powiązanymi klasami. Czytaj więcej na [Abstrakcja] (http://techieme.in/techieme/using-abstract-classes-and-interfaces/) – sErVerdevIL

Odpowiedz

9

subList(int,int) metoda nie jest nadpisane zarówno ArrayList i LinkedList, a do tego AbstractList stanowi wspólną realizację

Od źródła Java

public List<E> subList(int fromIndex, int toIndex) { 
     return (this instanceof RandomAccess ? 
       new RandomAccessSubList<E>(this, fromIndex, toIndex) : 
       new SubList<E>(this, fromIndex, toIndex)); 
    } 

Ponadto istnieją inne metody, które nie zostały nadpisane jak toString() i iterator()

+2

+1 za "Eagle Eye" –

+0

Więc tylko dla tej jedynej metody, przedłużają ją? – Raj

+0

@Raj Nie zapomnij o 'containsAll' i' toString' z 'AbstractCollection' (i' LinkedList' nie implementuje 'removeAll' lub' retainAll'). –

3

Nie wszystkie metody z AbstractList są nadpisane. Pamiętaj, że podklasy AbstractList podklasami AbstractCollection, które definiują metody takie jak containsAll lub toString, które nie są nadpisane przez ArrayList ani LinkedList.

+0

Czy istnieje zbiór które najczęściej wykorzystuje implementacja z abstractlist – Raj

+0

Jasne, powiedziałbym, że 'Collections.singletonList' zwraca implementację że odracza prawie wszystko na' AbstractList'. –

1

Użycie jest odnotowywane u góry pliku źródłowego AbstractList

"Ta klasa zapewnia szkieletową implementację interfejsu {@link} , aby zminimalizować wysiłek wymagany do wdrożenia tego interfejsu wspierany przez magazyn danych" losowy dostęp "(taki jak tablica). Na kolejnych danych dostępowych (takich jak połączonej listy), {@link AbstractSequentialList} powinien pierwszeństwo do tej klasy „.

Więc zasadniczo dostarcza kilka metod, aby zbudować wokół i ram, które jest bardziej wytrzymałe niż Lista interfejs.

4

można uzyskać odpowiedź od Tutaj ,,, AbstractList

Ta klasa dostarcza szkieletową implementację interfejsu List do zminimalizowania wysiłku potrzebnego do wdrożenia tego interfejsu wspierany przez „random access” magazynu danych (takie jak tablica) .W przypadku danych sekwencyjnego dostępu (takich jak lista połączona), AbstractSequentialList powinien być używane zamiast tej klasy. Aby zaimplementować listę niemodyfikowalną, programiści muszą jedynie rozszerzyć tę klasę i dostarczyć implementacje metod get (int index) i size().

Aby zaimplementować listę modyfikowalną, programista musi dodatkowo zastąpić metodę set (int index, Object object) (która w przeciwnym wypadku zgłasza wyjątek UnsupportedOperationException.) Jeśli lista ma zmienną wielkość, programista musi dodatkowo zastąpić parametr add (indeks int, Object object) i metody usuwania (ind index).

Programista powinien generalnie podać pustkę (bez argumentów) i konstruktor kolekcji, zgodnie z zaleceniami w specyfikacji interfejsu kolekcji.

W przeciwieństwie do innych implementacji kolekcji abstrakcyjnych, programista nie musi dostarczać implementacji Iterator; iterator i listIterator są implementowane przez tę klasę, na wierzchu metody "dostępu losowego": get (indeks int), set (indeks int, element Object), zestaw (indeks int, element Object), add (indeks int, element Object) i usuń (indeks int).

Dokumentacja każdej nie abstrakcyjnej metody w tej klasie opisuje szczegółowo jej implementację. Każda z tych metod może zostać nadpisana, jeśli implementowana kolekcja przyznaje, że jest bardziej wydajna.