Ich bin neu in Java und ich bin wirklich verwirrt mit Iterator und iterierbar. Kann mir jemand erklären und einige Beispiele geben?
195
An Iterable
ist eine einfache Darstellung einer Reihe von Elementen, die wiederholt werden können. Es hat keinen Iterationsstatus wie ein "aktuelles Element". Stattdessen gibt es eine Methode, die eine erzeugt Iterator
.
An Iterator
ist das Objekt mit dem Iterationsstatus. Hier können Sie überprüfen, ob mehr Elemente verwendet werden, hasNext()
und mit zum nächsten Element (falls vorhanden) wechseln next()
.
Normalerweise sollte ein Iterable
in der Lage sein, eine beliebige Anzahl gültiger Iterator
s zu erzeugen .
Iterable
hatinteral
oderexternal
Iterator oder ist es möglich, einen von ihnen zu haben?Eine Implementierung von
Iterable
ist eine, die eineIterator
von sich selbst bietet :Ein Iterator ist eine einfache Methode, mit der einige Benutzer eine Sammlung von Daten ohne Zuweisungsberechtigungen durchlaufen können (obwohl sie entfernt werden können).
Siehe Javadoc .
quelle
Ich werde die Frage speziell zu ArrayList als Beispiel beantworten, um Ihnen das Verständnis zu erleichtern.
. Und Iterable, Collection und List deklarieren nur die abstrakte Methode 'iterator ()' und ArrayList implementiert sie allein.
Die Methode 'iterator ()' gibt ein Objekt der Klasse 'Itr' zurück, das 'Iterator' implementiert.
Ist es jetzt klar? :) :)
quelle
Iterable<T>
in diesem Szenario ist? Welche Schritte müssen wir implementieren? Bitte schlagen Sie dieses Beispiel auch vor.Wenn eine Sammlung iterierbar ist, kann sie mit einem Iterator iteriert werden (und kann folglich in einer für jede Schleife verwendet werden). Der Iterator ist das eigentliche Objekt, das die Sammlung durchlaufen wird.
quelle
java.lang.Iterable
?java.lang.Iterable
Durch die Implementierung der Iterable-Schnittstelle kann ein Objekt das Ziel der Anweisung "foreach" sein.
Iterator ist eine Schnittstelle, die für die Iteration über Elemente implementiert ist. Iterable ist eine Schnittstelle, die Iterator bereitstellt.
quelle
Die wichtigste Überlegung ist, ob der betreffende Gegenstand mehr als einmal durchlaufen werden kann. Dies liegt daran, dass Sie eine Iterable jederzeit zurückspulen können, indem Sie iterator () erneut aufrufen. Es gibt jedoch keine Möglichkeit, einen Iterator zurückzuspulen.
quelle
Wie hier erklärt , wurde The " Iterable " eingeführt, um in der
foreach
Schleife verwendet werden zu können. Eine Klasse, die die Iterable- Schnittstelle implementiert , kann durchlaufen werden.Iterator ist eine Klasse, die die Iteration über eine Iterable verwaltet . Es behält den Zustand bei, in dem wir uns in der aktuellen Iteration befinden, und weiß, was das nächste Element ist und wie es abgerufen werden kann.
quelle
Betrachten Sie ein Beispiel mit 10 Äpfeln. Wenn es Iterable implementiert, ist es so, als würde man jeden Apfel in Kästchen von 1 bis 10 setzen und einen Iterator zurückgeben, der zum Navigieren verwendet werden kann.
Durch die Implementierung des Iterators können wir jeden Apfel, Apfel in den nächsten Kisten usw. erhalten.
Durch die Implementierung von iterable kann ein Iterator durch seine Elemente navigieren, obwohl zum Navigieren ein Iterator implementiert werden muss.
quelle
Frage: Unterschied zwischen Iterable und Iterator?
Ans:
iterable: Es bezieht sich auf forEach-Schleifeniterator
: Is bezieht sich auf Collection
Das Zielelement der forEach-Schleife muss iterierbar sein.
Wir können Iterator verwenden, um das Objekt einzeln aus der Sammlung abzurufen
Iterable vorhanden in java.ḷang Paket
vorhanden Iterator in java.util-Paket vorhanden
Enthält nur einen Methodeniterator ()
Enthält drei Methoden hasNext (), next (), remove ()
Eingeführt in Version 1.5
Eingeführt in Version 1.2
quelle
Grundsätzlich sind beide sehr eng miteinander verwandt.
Betrachten Sie Iterator als eine Schnittstelle, die uns beim Durchlaufen einer Sammlung mithilfe einiger undefinierter Methoden wie hasNext (), next () und remove () hilft.
Auf der anderen Seite ist Iterable eine weitere Schnittstelle, die, wenn sie von einer Klasse implementiert wird, die Klasse zu Iterable zwingt und ein Ziel für For-Each-Konstrukte ist. Es gibt nur eine Methode namens iterator (), die von der Iterator-Schnittstelle selbst stammt.
Wenn eine Sammlung iterierbar ist, kann sie mit einem Iterator iteriert werden.
Zum Verständnis besuchen Sie diese:
ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java
ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java
quelle
Ich weiß, dass dies eine alte Frage ist, aber für jeden, der dies liest, der mit derselben Frage feststeckt und mit der ganzen Terminologie überfordert ist, ist hier eine gute, einfache Analogie, die Ihnen hilft, diese Unterscheidung zwischen Iterablen und Iteratoren zu verstehen:
Denken Sie an eine öffentliche Bibliothek. Alte Schule. Mit Papierbüchern. Ja, diese Art von Bibliothek.
Ein Regal voller Bücher wäre wie ein iterierbares. Sie können die lange Reihe von Büchern im Regal sehen. Sie wissen vielleicht nicht, wie viele, aber Sie können sehen, dass es sich um eine lange Sammlung von Büchern handelt.
Der Bibliothekar wäre wie der Iterator. Er kann jederzeit auf ein bestimmtes Buch verweisen. Er kann das Buch an der Stelle einfügen / entfernen / ändern / lesen, auf die er zeigt. Er zeigt nacheinander jedes Mal auf jedes Buch, wenn Sie "next!" zu ihm. Normalerweise würden Sie ihn also fragen: "Hat Next?", Und er wird "Ja" sagen, zu dem Sie "Weiter" sagen. und er wird auf das nächste Buch zeigen. Er weiß auch, wann er das Ende des Regals erreicht hat, so dass, wenn Sie fragen: "Hat Next?" er wird "nein" sagen.
Ich weiß, dass es ein bisschen albern ist, aber ich hoffe, das hilft.
quelle
Neben ColinD und Seeker Antworten.
In einfachen Worten, Iterable und Iterator sind beide Schnittstellen, die im Java Collection Framework bereitgestellt werden.
Wiederholbar
Eine Klasse muss die Iterable-Schnittstelle implementieren, wenn sie eine for-each- Schleife zum Durchlaufen ihrer Sammlung haben möchte . Die for-each-Schleife kann jedoch nur verwendet werden, um die Sammlung in Vorwärtsrichtung zu durchlaufen, und Sie können die Elemente in dieser Sammlung nicht ändern . Wenn Sie jedoch nur die Elementdaten lesen möchten, ist dies sehr einfach und dank des Java-Lambda-Ausdrucks häufig ein Einzeiler. Beispielsweise:
Iterator
Mit dieser Schnittstelle können Sie eine Sammlung durchlaufen und deren Elemente abrufen und entfernen. Jede der Auflistungsklassen stellt eine iterator () -Methode bereit , die einen Iterator an den Anfang der Auflistung zurückgibt. Der Vorteil dieser Schnittstelle gegenüber iterierbar ist, dass Sie mit dieser Schnittstelle Elemente in einer Sammlung hinzufügen, ändern oder entfernen können . Der Zugriff auf Elemente erfordert jedoch etwas mehr Code als iterierbar. Beispielsweise:
Quellen:
quelle
Iterable
wurden eingeführt, um für jede Schleife in Java zu verwendenIterator
ist eine Klasse, die die Iteration über eine verwaltetIterable
. Es behält den Zustand bei, in dem wir uns in der aktuellen Iteration befinden, und weiß, was das nächste Element ist und wie es abgerufen werden kann.quelle