2013-08-23 9 views
9

Perché LinkedList e ArrayList si estende AbstractList in Java?Perché LinkedList e arraylist estende AbstractList in java?

Le classi astratte vengono utilizzate quando si desidera specificare un comportamento comune nelle classi di implementazione.

Ma tutti i metodi che sono in AbstractList sono sovrascritti da ArrayList e LinkedList.

Quindi a che serve estendere questa classe?

+0

[La descrizione di livello superiore della classe] (http://docs.oracle.com/javase/7/docs/api/java/util/AbstractList.html) mi sembra sufficiente. Poiché 'ArrayList' e' LinkedList' hanno diversi supporti, mi aspetterei che implementino determinati metodi in modo diverso. – Makoto

+2

LinkedList estende AbstractList in Java (1.6). Estende AbstractSequentialList – Jayan

+0

L'astrazione non sta semplicemente estendendo il comportamento comune. È anche stabilire relazioni tra classi strettamente correlate. Maggiori informazioni su [Abstraction] (http://techieme.in/techieme/using-abstract-classes-and-interfaces/) – sErVerdevIL

risposta

9

subList(int,int) non viene sovrascritto sia ArrayList e LinkedList, e per questo AbstractList fornisce un'implementazione comune

Da sorgenti 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)); 
    } 

In aggiunta ci sono altri metodi che non sono sovrascritte come toString() e iterator()

+2

+1 per 'Eagle eye' –

+0

Quindi, solo per questo unico metodo, lo stanno estendendo? – Raj

+0

@Raj Non dimenticare 'containsAll' e' toString' da 'AbstractCollection' (e' LinkedList' non implementa 'removeAll' o' retainAll' neanche). –

3

Non tutti i metodi da AbstractList vengono sovrascritti. Ricordare che le sottoclassi AbstractList sottoclasse AbstractCollection, che definisce metodi come containsAll o toString che non sono sovrascritti né da ArrayList né da LinkedList. Metodo

+0

C'è una collezione che utilizza principalmente l'implementazione di abstractlist – Raj

+0

Certo, direi che 'Collections.singletonList' restituisce un'implementazione che rimanda la maggior parte di tutto a' AbstractList'. –

1

L'utilizzo è indicato nella parte superiore del file sorgente AbstractList

"Questa classe fornisce un'implementazione scheletrica dell'interfaccia {@link List} per ridurre al minimo lo sforzo richiesto per implementare questa interfaccia supportata da un archivio dati" accesso casuale "(ad esempio un array). Per dati di accesso sequenziale (ad esempio, una lista collegata), {@link AbstractSequentialList} dovrebbe essere usato a preferenza di questa classe."

Quindi, in sostanza fornisce alcuni metodi per costruire intorno e un quadro di riferimento che è più robusto di l'interfaccia List.

4

È possibile ottenere risposta da Qui ,,, AbstractList

questa classe fornisce un'implementazione scheletrica dell'interfaccia List per ridurre al minimo lo sforzo richiesto per implementare questa interfaccia supportata da un "accesso casuale" archivio di dati (come un array) Per dati di accesso sequenziale (come un elenco collegato), dovrebbe essere AbstractSequentialList essere usato preferibilmente a questa classe. Per implementare un Elenco non modificabile, il programmatore deve solo estendere questa classe e fornire implementazioni per i metodi get (int index) e size().

Per implementare un elenco modificabile, il programmatore deve inoltre eseguire l'override del metodo set (int index, Object element) (che altrimenti genera un'eccezione UnsupportedOperationException. Se l'elenco è di dimensioni variabili, il programmatore deve inoltre sostituire l'add (int index, Elemento Object) e rimuovere i metodi (int index)

Il programmatore deve generalmente fornire un costruttore vuoto (senza argomenti) e Collection, come da raccomandazione nella specifica dell'interfaccia Collection.

A differenza delle altre implementazioni di Raccolta astratta, il programmatore non deve fornire un'implementazione di Iterator; l'iteratore e l'elencoIterator sono implementati da questa classe, in cima ai metodi di "accesso casuale": get (int index), set (int index, Object object), set (int index, Object element), add (int index, Object object) e rimuovere (int index).

La documentazione per ogni metodo non astratto in questa classe descrive la sua implementazione in dettaglio. Ognuno di questi metodi può essere sovrascritto se la raccolta implementata ammette un'implementazione più efficiente.

Problemi correlati