Differenza tra Iteratore e Listiterator?


138
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

Possiamo usare Iteratorper attraversare a Seto a Listo a Map. Ma ListIteratorpuò essere utilizzato solo per attraversare a List, non può attraversare a Set. Perché?

So che la differenza principale è che con iteratore possiamo viaggiare solo in una direzione ma con ListIteratornoi possiamo viaggiare in entrambe le direzioni. Ci sono altre differenze? E qualche vantaggio di ListIteratorover Iterator?


oltre alla risposta di Peters ti consiglierei di leggere un capitolo nel pensare a java sugli iteratori con tutti i bei esempi lì
formica

Risposte:


150

Le differenze sono elencate in Javadoc per ListIterator

Puoi

  • iterare all'indietro
  • ottenere l'iteratore in qualsiasi momento.
  • aggiungi un nuovo valore in qualsiasi momento.
  • impostare un nuovo valore in quel punto.

68
E il motivo per cui non è possibile farlo con a Setè semplice: non esiste un "punto corrente": gli elementi non hanno un indice e non esiste un modo utile per aggiungere un elemento "prima" o "dopo" un altro.
Joachim Sauer,

@Peter Lawrey ottiene l'indice in qualsiasi momento - Riguarda i metodi previousIndex () e nextIndex () ?
gstackoverflow,

2
@gstackoverflow check java.util.List # listIterator (int)
kilonet

4
@kilonet invece di ottenere l'indice in qualsiasi momento , dovrebbe essere espresso come "ottenere l'iteratore in qualsiasi momento" per evitare confusione?
Shailesh Pratapwar,

39

Ci sono due differenze:

  1. Possiamo usare Iterator per attraversare Set ed Elenco e anche Mappa tipo di oggetti. Mentre un ListIterator può essere utilizzato per attraversare oggetti di tipo Elenco, ma non per oggetti di tipo Set.

    Cioè, possiamo ottenere un oggetto Iterator usando Set and List, vedi qui:

    Usando Iterator possiamo recuperare gli elementi dall'oggetto Collection solo in avanti.

    Metodi in Iteratore:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Ma otteniamo l'oggetto ListIterator solo dall'interfaccia Elenco, vedi qui:

    dove come ListIterator ti permette di attraversare in entrambe le direzioni (sia in avanti che all'indietro). Quindi ha altri due metodi simili hasPrevious()e previous()diversi da quelli di Iterator. Inoltre, possiamo ottenere indici degli elementi successivi o precedenti (usando nextIndex() e previousIndex()rispettivamente)

    Metodi in ListIterator:

    1. hasNext ()
    2. Il prossimo()
    3. precedente()
    4. hasPrevious ()
    5. rimuovere()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    cioè, non possiamo ottenere l'oggetto ListIterator dall'interfaccia Set.

Riferimento: - Qual è la differenza tra Iterator e ListIterator?


39
Sembra che sia in gran parte tagliato e incollato da kirankumarjava.blogspot.com/2013/06/… . Devi sempre riconoscere l'autore originale.
Cameron Skinner,

25

Iterator è una super classe di ListIterator.

Ecco le differenze tra loro:

  1. Con iteratorte puoi muoverti solo in avanti, ma con ListIteratorte puoi spostare anche le parole arretrate durante la lettura degli elementi.
  2. Con ListIteratorte puoi ottenere l'indice in qualsiasi momento mentre attraversi, cosa impossibile con iterators.
  3. Con iteratorpuoi controllare solo per l'elemento successivo disponibile o meno, ma in listiteratorpuoi controllare gli elementi precedenti e successivi.
  4. Con listiteratorte puoi aggiungere nuovo elemento in qualsiasi momento, mentre attraversi. Non possibile con iterator.
  5. Con listiteratorte puoi modificare un elemento mentre attraversi, cosa impossibile con iterator.

Aspetto di Iterator:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

Aspetto di ListIterator:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.