Unterschied zwischen Iterator und Listiterator?

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

ListIterator listite = List.listIterator();

Wir können verwenden Iterator, um ein Setoder ein Listoder ein zu durchqueren Map. Aber ListIteratornur ein zu durchqueren verwendet werden List, es kann eine nicht durchqueren Set. Warum?

Ich weiß, dass der Hauptunterschied darin besteht, dass wir mit dem Iterator nur in eine Richtung fahren können, aber mit ListIteratorbeiden Richtungen. Gibt es noch andere Unterschiede? Und irgendwelche Vorteile von ListIteratorüber Iterator?

Siva
quelle
neben Peters Antwort würde ich empfehlen Sie ein Kapitel in Denken in Java über Iteratoren mit allen schönen Beispielen dort lesen
ant

Antworten:

150

Die Unterschiede sind im Javadoc for ListIterator aufgeführt

Sie können

  • rückwärts iterieren
  • Erhalten Sie den Iterator an jedem Punkt.
  • Fügen Sie jederzeit einen neuen Wert hinzu.
  • Stellen Sie an dieser Stelle einen neuen Wert ein.
Peter Lawrey
quelle
68
Und der Grund, warum Sie das mit a nicht tun können, Setist einfach: Es gibt keinen "aktuellen Punkt": Elemente haben keinen Index und es gibt keine nützliche Möglichkeit, ein Element "vor" oder "nach" einem anderen Element hinzuzufügen.
Joachim Sauer
@Peter Lawrey erhält den Index zu jedem Zeitpunkt - Geht es um die Methoden previousIndex () und nextIndex () ?
Gstackoverflow
2
@gstackoverflow check java.util.List # listIterator (int)
Kilonet
4
@kilonet, anstatt den Index zu irgendeinem Zeitpunkt zu erhalten , sollte er wie folgt lauten: "Den Iterator zu jedem Zeitpunkt erhalten", um Verwirrung zu vermeiden?
Shailesh Pratapwar
39

Es gibt zwei Unterschiede:

  1. Wir können Iterator verwenden, um Set- und List- sowie Map-Objekttypen zu durchlaufen. Ein ListIterator kann zwar zum Durchlaufen von Objekten vom Listentyp verwendet werden, nicht jedoch von Objekten vom Typ Set.

    Das heißt, wir können ein Iterator-Objekt mithilfe von Set und List erhalten, siehe hier:

    Mit Iterator können wir die Elemente aus dem Sammlungsobjekt nur in Vorwärtsrichtung abrufen.

    Methoden im Iterator:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Wir erhalten das ListIterator-Objekt jedoch nur von der List-Oberfläche, siehe hier:

    Dabei können Sie als ListIterator in beide Richtungen (sowohl vorwärts als auch rückwärts) fahren. Es gibt also zwei weitere Methoden wie hasPrevious()und previous()andere als die von Iterator. Außerdem können wir Indizes der nächsten oder vorherigen Elemente erhalten (mit nextIndex() und previousIndex()jeweils)

    Methoden in ListIterator:

    1. hasNext ()
    2. Nächster()
    3. Bisherige()
    4. hasPrevious ()
    5. entfernen()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    Das heißt, wir können das ListIterator-Objekt nicht von der Set-Schnittstelle abrufen.

Referenz: - Was ist der Unterschied zwischen Iterator und ListIterator?

jaideep
quelle
39
Dies sieht so aus, als ob es größtenteils aus kirankumarjava.blogspot.com/2013/06/… ausgeschnitten und eingefügt wurde . Sie müssen immer den ursprünglichen Autor anerkennen.
Cameron Skinner
25

Iterator ist eine Superklasse von ListIterator.

Hier sind die Unterschiede zwischen ihnen:

  1. Mit können iteratorSie nur vorwärts gehen, aber mit ListIteratorkönnen Sie auch beim Lesen der Elemente das Rückwort verschieben.
  2. Mit können ListIteratorSie den Index jederzeit während des Durchlaufs erhalten, was mit iterators nicht möglich ist .
  3. Mit iteratorkönnen Sie nur nach dem nächsten verfügbaren Element suchen oder nicht, aber in listiteratorkönnen Sie vorherige und nächste Elemente überprüfen.
  4. Mit können listiteratorSie jederzeit neue Elemente hinzufügen, während Sie durchlaufen. Nicht möglich mit iterator.
  5. Mit können listiteratorSie ein Element beim Durchlaufen ändern, was mit nicht möglich ist iterator.

Iterator Look and Feel:

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

ListIterator-Erscheinungsbild:

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
}
user1923551
quelle