Dies ist eine Interviewfrage, die mir kürzlich gestellt wurde. Dieser Blog fasst diese Frage zusammen und teilt sie. 1. Häufige Fehler von AnfängernVielleicht würden viele Neulinge (einschließlich mir damals, haha) zuerst daran denken, so etwas zu schreiben: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); für (String-Plattform: Plattformliste) { if (platform.equals("Plattform")) { PlattformList.entfernen(Plattform); } } System.out.println(Plattformliste); } Dann habe ich es mit Zuversicht ausgeführt, aber es stellte sich heraus, Sind Sie verwirrt und fragen sich, warum das passiert? Schauen wir uns zunächst den durch den obigen Code generierten Bytecode an, wie unten dargestellt: Daraus können wir ersehen, dass bei der tatsächlichen Ausführung der foreach-Schleife tatsächlich ein Iterator verwendet wird und dass die verwendeten Kernmethoden hasnext() und next() sind. Schauen wir uns dann an, wie der Iterator der ArrayList-Klasse implementiert ist. Es ist ersichtlich, dass beim Aufrufen der Methode next () zum Abrufen des nächsten Elements die erste Codezeile darin besteht, checkForComodification (); aufzurufen, und die Kernlogik dieser Methode besteht darin, die Werte der beiden Variablen modCount und expectedModCount zu vergleichen. Im obigen Beispiel sind die Werte von modCount und expectedModCount zu Beginn beide 3, sodass es kein Problem gibt, das Element „博客园“ zum ersten Mal zu erhalten, aber wenn die folgende Codezeile ausgeführt wird: PlattformList.entfernen(Plattform); Der Wert von modCount wird auf 4 geändert. Beim zweiten Abrufen des Elements sind die Werte von modCount und expectedModCount nicht gleich und daher wird der Fehler ausgelöst. Da dies mit foreach nicht erreicht werden kann, wie können wir es implementieren? Es gibt drei Hauptmethoden:
Als nächstes werde ich sie einzeln erklären. 2. Verwenden Sie die remove()-Methode des IteratorsDie Implementierung der remove()-Methode mit Iterator ist wie folgt: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); Iterator<String> iterator = Plattformliste.iterator(); während (Iterator.hasNext()) { String-Plattform = Iterator.next(); if (platform.equals("Plattform")) { iterator.entfernen(); } } System.out.println(Plattformliste); } Die Ausgabe ist:
Warum können wir iterator.remove() verwenden? Schauen wir uns den Quellcode an: Es ist ersichtlich, dass jedes Mal, wenn ein Element gelöscht wird, der Wert von modCount expectedModCount neu zugewiesen wird, sodass die beiden Variablen gleich sind und nicht ausgelöst werden 3. Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufenDie Implementierung der Vorwärtsdurchquerung mithilfe einer For-Schleife sieht wie folgt aus: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); für (int i = 0; i < platformList.size(); i++) { Zeichenfolgeelement = Plattformliste.get(i); if (item.equals("Element löschen")) { Plattformliste.entfernen(i); = i - 1; } } System.out.println(Plattformliste); } Diese Implementierung ist relativ einfach zu verstehen, d. h. das Löschen erfolgt über den Array-Index. Es gibt jedoch einen Hinweis, dass nach dem Löschen des Elements der Indexwert korrigiert werden muss: = i - 1; Warum müssen wir den Wert des Index korrigieren? Denn der Index des Anfangselements sieht folgendermaßen aus: Nach dem Löschen des Elements „博客园“ in der ersten Schleife sieht der Index des Elements wie folgt aus: In der zweiten Schleife ist der Wert von i gleich 1, was bedeutet, dass das Element „Nuggets“ genommen wird, was dazu führt, dass das Element „CSDN“ übersprungen wird. Daher müssen wir nach dem Löschen des Elements den Index korrigieren, was auch der Zweck von i = i - 1; im obigen Code ist. Für weitere Interviewfragen können Sie der WeChat-Abonnementnummer Jiangjiji folgen und auf das Interview antworten, um 4. Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufenDie Implementierung der umgekehrten Durchquerung mithilfe einer For-Schleife sieht wie folgt aus: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); für (int i = platformList.size() - 1; i >= 0; i--) { Zeichenfolgeelement = Plattformliste.get(i); wenn (item.equals("Nuggets")) { Plattformliste.entfernen(i); } } System.out.println(Plattformliste); } Diese Implementierung ähnelt der Verwendung einer For-Schleife zum Durchlaufen in Vorwärtsreihenfolge, die Indizes müssen jedoch nicht korrigiert werden, da die Indizes der Elemente am Anfang wie folgt lauten: Nach dem Löschen des Elements „Nuggets“ in der ersten Schleife sehen die Indizes der Elemente wie folgt aus: In der zweiten Schleife ist der Wert von i 1, was bedeutet, dass das Element "CSDN" erhalten wird, was nicht dazu führt, dass das Element übersprungen wird, sodass der Index nicht korrigiert werden muss. Beim zweiten Abrufen des Elements sind die Werte von modCount und expectedModCount nicht gleich und daher wird der Fehler ausgelöst. Da dies mit foreach nicht erreicht werden kann, wie können wir es implementieren? Es gibt drei Hauptmethoden:
Als nächstes werde ich sie einzeln erklären. 5. Verwenden Sie die remove()-Methode des IteratorsDie Implementierung der remove()-Methode mit Iterator ist wie folgt: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); Iterator<String> iterator = Plattformliste.iterator(); während (Iterator.hasNext()) { String-Plattform = Iterator.next(); if (platform.equals("Plattform")) { iterator.entfernen(); } } System.out.println(Plattformliste); } Die Ausgabe ist:
Warum können wir iterator.remove() verwenden? Schauen wir uns den Quellcode an: Es ist ersichtlich, dass jedes Mal, wenn ein Element gelöscht wird, der Wert von modCount expectedModCount neu zugewiesen wird, sodass die beiden Variablen gleich sind und nicht ausgelöst werden 6. Verwenden Sie eine for-Schleife, um in positiver Reihenfolge zu durchlaufenDie Implementierung der Vorwärtsdurchquerung mithilfe einer For-Schleife sieht wie folgt aus: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); für (int i = 0; i < platformList.size(); i++) { Zeichenfolgeelement = Plattformliste.get(i); if (item.equals("Element löschen")) { Plattformliste.entfernen(i); = i - 1; } } System.out.println(Plattformliste); } Diese Implementierung ist relativ einfach zu verstehen, d. h. das Löschen erfolgt über den Array-Index. Es gibt jedoch einen Hinweis, dass nach dem Löschen des Elements der Indexwert korrigiert werden muss: = i - 1; Warum müssen wir den Wert des Index korrigieren? Denn der Index des Anfangselements sieht folgendermaßen aus: Nach dem Löschen des Elements „博客园“ in der ersten Schleife sieht der Index des Elements wie folgt aus: In der zweiten Schleife ist der Wert von i gleich 1, was bedeutet, dass das Element „Nuggets“ genommen wird, was dazu führt, dass das Element „CSDN“ übersprungen wird. Daher müssen wir nach dem Löschen des Elements den Index korrigieren, was auch der Zweck von i = i - 1; im obigen Code ist. Für weitere Interviewfragen können Sie der WeChat-Abonnementnummer Jiangjiji folgen und auf das Interview antworten, um 7. Verwenden Sie eine for-Schleife, um in umgekehrter Reihenfolge zu durchlaufenDie Implementierung der umgekehrten Durchquerung mithilfe einer For-Schleife sieht wie folgt aus: öffentliche statische void main(String[] args) { Liste<String> Plattformliste = neue ArrayList<>(); platformList.add("Datei hinzufügen"); platformList.add("CSDN"); Plattformliste.add("Nuggets"); für (int i = platformList.size() - 1; i >= 0; i--) { Zeichenfolgeelement = Plattformliste.get(i); wenn (item.equals("Nuggets")) { Plattformliste.entfernen(i); } } System.out.println(Plattformliste); } Diese Implementierung ähnelt der Verwendung einer For-Schleife zum Durchlaufen in Vorwärtsreihenfolge, die Indizes müssen jedoch nicht korrigiert werden, da die Indizes der Elemente am Anfang wie folgt lauten: Nach dem Löschen des Elements „Nuggets“ in der ersten Schleife sehen die Indizes der Elemente wie folgt aus: In der zweiten Schleife ist der Wert von i 1, was bedeutet, dass das Element "CSDN" erhalten wird, was nicht dazu führt, dass das Element übersprungen wird, sodass der Index nicht korrigiert werden muss. Dies ist das Ende dieses Artikels darüber, ob MySQL oder Redis für die Like-Funktion verwendet werden soll. Weitere relevante MySQL/Redis-Like-Inhalte finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Kernkompetenzen, die Web-Frontend-Entwicklungsingenieure beherrschen müssen
>>: Drei Möglichkeiten, durch Klicken auf ein Button-Tag in HTML zu einer Seite zu springen
Als ich heute bei der Arbeit war, wurde mir von d...
In diesem Artikelbeispiel wird der spezifische Ja...
Inhaltsverzeichnis Tutorial-Reihe 1. Benutzerverw...
1. Gehen Sie zu dem Speicherort, an dem Sie das I...
1 Gespeicherte Prozedur 1.1 Was ist eine gespeich...
Code kopieren Der Code lautet wie folgt: @Zeichen...
1. Entpacken Sie MySQL 8.0.16 Der Ordner dada und...
Die automatische Inkrementierung der Primärschlüs...
Inhaltsverzeichnis Hintergrund analysieren Verfah...
nginx Version 1.11.3 Bei Verwendung der folgenden...
Da Benutzer immer datenschutzbewusster werden und...
Die Pfeilfunktion ist eine neue Funktion in ES6. ...
Was ist die Nginx-Zugriffsbeschränkungskonfigurat...
Als ich zum ersten Mal mit HTML in Berührung kam,...
Seitendesigns im dunklen Hintergrundstil sind seh...