Inhaltsverzeichnis
1. Der Unterschied zwischen Iterator und foreach
1 Warum heißt es, dass die unterste Ebene von foreach der Iterator-Code ist? geschrieben:
Alibaba Java Development Manual
Werfen wir zunächst einen Blick auf die Situation des Löschens „2“:
Der erste Satz ① ruft iterator() auf,
Heim Java javaLernprogramm Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

Apr 27, 2023 pm 03:40 PM
java foreach arraylist

    1. Der Unterschied zwischen Iterator und foreach

    • Polymorpher Unterschied (die unterste Ebene von foreach ist Iterator)

    • Iterator ist ein Schnittstellentyp, der sich nicht um die Art der Sammlung oder des Arrays kümmert;

    • for und Foreach müssen zuerst den Typ der Sammlung und sogar den Typ der Elemente in der Sammlung kennen;

    1 Warum heißt es, dass die unterste Ebene von foreach der Iterator-Code ist? geschrieben:

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?Dekompilierter Code:

    2. Der Unterschied zwischen Remove in foreach und Iterator Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

    Schauen wir uns zuerst

    Alibaba Java Development Manual

    an. 1 , und in 2 wird ein Fehler gemeldet (java.util.ConcurrentModificationException)

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?Werfen wir zunächst einen Blick auf die Implementierung der Iteratormethode in ArrayList:

    ruft new Itr() zum Generieren auf die Itr-Klasse (Iterator). Zu diesem Zeitpunkt werden die drei Parameter von Itr initialisiert. Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

    Cursor stellt die nächste Indexposition dar (beginnend bei 0)
    • size ist die Größe der Sammlung (2)
    • wird überprüft, wenn die Ausnahmeklasse

    next method () wird geworfen CheckForComodification ist gleich

    modCount Änderungsanzahl (jedes Hinzufügen und Entfernen wird +1) erwartetModCount Die maximale erwartete AnzahlWas ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

    1.Remove-Operation Quellcode-Analyse

    Werfen wir zunächst einen Blick auf die Situation des Löschens „2“:

    Nein. Eine Schleife:

    Da modCount und erwartetModCount zu diesem Zeitpunkt beide 2 sind (modCount ist 2, weil es zweimal hinzugefügt wurde), wird in der ersten Schleife keine Ausnahme ausgelöst und es werden auch keine Ausnahmen ausgelöst Bei sekundären Zyklen in die erste Schleife geworfen. Nachdem die nächste Methode abgeschlossen ist, ist die if-Bedingung der Methode „remove“ im Methodenkörper der foreach-Schleife nicht erfüllt und die Schleife endet.
    Zweite Schleife:

    Die hasNext- und next-Methoden der zweiten Schleife können erfolgreich abgeschlossen werden. Danach wird die Methode „remove“ in den Methodenkörper der foreach-Schleife eingegeben, um Elemente zu löschen. Zu diesem Zeitpunkt wird Größe-1 zu 1. In der fastRemove-Methode wird in der Remove-Methode modCount + 1 hinzugefügt, was zu 3 wird.

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?Die dritte Schleife:

    Dann wird in der dritten Schleife zur hasNext-Methode übergegangen. Unter normalen Umständen gibt diese Methode false zurück. Da sich die Größe zu diesem Zeitpunkt jedoch auf 1 geändert hat und der Cursor zu diesem Zeitpunkt 2 ist (der Cursor stellt die nächste Indexposition dar), sind die beiden nicht gleich und es wird ein Fehler zurückgegeben . true, daher wird in der nächsten Methode weiterhin mit der checkForComodification-Methode fortgefahren, um festzustellen, ob modCount und erwartetModCount zu diesem Zeitpunkt gleich sind. Da sich der modCount zu diesem Zeitpunkt auf 3 geändert hat, was sich vom erwarteten ModCount-Wert 2 unterscheidet, wurde hier eine ConcurrentModificationException-Ausnahme ausgelöst.

    Schauen wir uns an, warum beim Löschen von „1“ keine Ausnahme ausgelöst wird:



    Erste Schleife:

    Wie oben, zu diesem Zeitpunkt sind modCount und erwartetModCount beide 2, also in der ersten Schleife Keines von beiden hasNext- und next-Methoden lösen Ausnahmen aus. Danach wird die Methode „remove“ in den Methodenkörper der foreach-Schleife eingegeben, um das Element zu löschen. Wie oben wird size-1 zu 1 und modCount+1 zu 3.

    Zweite Schleife:

    In der hasNext-Methode der zweiten Schleife ist der Cursor zu diesem Zeitpunkt 1 und die Größe ist ebenfalls 1, und sie sind gleich. Wenn die hasNext-Methode also false zurückgibt, springt sie aus der foreach-Schleife und geht nicht zur nachfolgenden next-Methode über, sodass keine Ausnahme ausgelöst wird.

    2. Quellcode-Schritte

    Der erste Satz ① ruft iterator() auf,

    ruft new Itr() auf, um die Itr-Klasse (Iterator) zu generieren. Zu diesem Zeitpunkt werden die drei Parameter von Itr initialisiert.

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?

    Zu diesem Zeitpunkt wird erwartetModCount == modCount == 2 (da die Liste die Add-Methode mobilisiert, implementiert die Add-Methode die ++-Operation für modCount)
    Der zweite Satz ruft die HasNext()-Methode unten auf und Gibt den nächsten Zugriff zurück. Der tiefgestellte Cursor des Elements, da es sich um die erste Schleife handelt, ist der Cursor 0 und die Größe ist 2 (0 != 2 wahr)
    Die Methode next() wird in aufgerufen ③ Satz, und die Methode zum Entfernen im Methodenkörper der foreach-Schleife lautet: Wenn die Bedingung nicht erfüllt ist, endet die Schleife. Der nächste tiefgestellte Cursor des Elements, auf das zugegriffen werden soll, führt eine zweite Schleife durch, sodass der Cursor 1 ist, #🎜🎜 #size ist immer noch 2 (1 != 2 wahr)

    Die next()-Methode wird im ③-Satz aufgerufen und als normaler Wert verwendet, um das erste Element „2“ zu erhalten;

    Das entfernen( )-Methode wird in Satz ④ aufgerufen und das Element wurde erfolgreich aus der Liste gelöscht. Beachten Sie, dass beim Aufruf der Methode „remove“ modCount++ vorhanden ist. Alles zu diesem Zeitpunkt, modCount3, erwartetModCount2, size1

    Das dritte Mal



    Der zweite Satz ruft die unten stehende hasNext()-Methode auf und gibt die zurück next item Greifen Sie zum zweiten Mal auf den tiefgestellten Cursor des Elements zu und wiederholen Sie die Schleife, sodass der Cursor 2 und die Größe 1 beträgt
    Der ③-Satz ruft die next()-Methode auf. Beachten Sie, dass der erste Satz in next() ist. Die Methode besteht darin, checkForComodification() aufzurufen. Da modCount(3) != erwartetModCount(2) wird eine Ausnahme ausgelöst.

    3. Warum sind die unteren Ebenen alle Iteratoren und warum meldet foreach einen Fehler


    Wenn die Schleife endet while (iterator.hasNext()) prüft, ob das nächste Element vorhanden ist, nachdem Remove 2 abgeschlossen ist. Bei der nächsten Eingabe ist der Cursor immer noch 1 und die Größe ist ebenfalls 1.

    foreach, nach dem Entfernen von Remove2, Das nächste Mal, wenn Sie den Cursor eingeben, ist er 2, die Größe ist 1, also geben Sie false zurück, fahren Sie mit der nächsten Methode fort und prüfen Sie dann, modCount=3 und erwartetModCount=2

    #🎜 🎜#Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?# 🎜🎜#

    3. Quellcode-Methode anzeigen

    Wenn Sie die ArrayList unter Iterator anzeigen

    Was ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?#🎜🎜 #

    Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen der Verwendung von foreach und iterator zum Löschen von Elementen beim Durchlaufen von Java ArrayList?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

    Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

    Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

    Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

    Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

    Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

    Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

    Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

    Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

    Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

    Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

    In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

    Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

    Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

    See all articles