Es gibt viele Möglichkeiten, Elemente in List oder Map zu durchqueren und zu löschen, und es treten Probleme auf, wenn sie nicht ordnungsgemäß verwendet werden. Lassen Sie uns aus diesem Artikel unten lernen.
1. Löschen Sie Elemente während der Listenquelle
Verwenden Sie das Index -Abschluss -Traversal
Beispiel: 2 in der Liste löschen
public static void main (String [] args) {list <Integer> list = new ArrayList <GanzEger> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); für (int i = 0; i <list.size (); i ++) {if (2 == list.get (i)) {list.remove (i); } System.out.println (list.get (i)); } System.out.println ("list =" + list.toString ()); }Ausgangsergebnis:
1234List = [1, 2, 3, 4]
Frage:
Das Ergebnis zeigt, dass nur ein 2 gelöscht wurde und die anderen 2 übersehen wurden. Der Grund ist: Nach dem Löschen der ersten 2 wird die Anzahl der Elemente im Set um 1 reduziert, und die nachfolgenden Elemente werden um 1 Bit vorgezogen, was dazu führt, dass die zweiten 2 übersehen werden.
So verwenden Sie für Schleifentraversal
Beispiel:
public static void listIterator2 () {list <Integer> list = new ArrayList <Integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); für (int value: list) {if (2 == value) {list.remove (value); } System.out.println (Wert); } System.out.println (Wert); } System.out.println ("list =" + list.toString ()); }Ergebnis:
Ausnahme in Thread "Main" 12Java.util.ConcurrentModificationException bei java.util.arrayList $ ittr.CheckForcomodification (unbekannte Quelle) bei Java.util.ArrayList $ ittr.next (Unbekannte Quelle) bei test.listiterator.java:39) At test.listiter.java:30) at test.
veranschaulichen:
Beschreibung der ConcurrentModificationException in JDK:
public class ConcurrentModificationException extends
RunTimeException Diese Ausnahme wird ausgelöst, wenn die Methode eine gleichzeitige Modifikation des Objekts erkennt, jedoch keine solche Änderung zulässt.
Wenn beispielsweise ein Thread in einer Sammlung iteriert, darf eine weitere lineare Modifikation normalerweise nicht vorgenommen werden. Normalerweise sind in diesen Fällen die Ergebnisse der Iteration ungewiss. Wenn dieses Verhalten festgestellt wird, können einige Iterator -Implementierungen (einschließlich aller von JRE bereitgestellten allgemeinen Sammlungsimplementierungen) diese Ausnahme ausführen. Der Iterator, der diesen Vorgang ausführt, wird als Iterator für schnelles Ausfall als Iterator bezeichnet, da der Iterator sehr schnell fehlschlägt, ohne das Risiko eines willkürlichen ungewöhnlichen Verhaltens zu einem bestimmten Zeitpunkt in der Zukunft zu riskieren.
Hinweis : Diese Ausnahme zeigt nicht immer, dass das Objekt gleichzeitig durch einen anderen Thread geändert wurde. Wenn ein einzelner Thread eine Abfolge von Methodenaufrufen ausgibt, die gegen den Vertrag des Objekts verstoßen, kann das Objekt diese Ausnahme ausführen. Wenn beispielsweise ein Thread die Sammlung direkt ändert, wenn die Sammlung mit einem schnellen Iterator iteriert, wird der Iterator diese Ausnahme ausgelöst.
HINWEIS : Das schnelle Verhalten des Iterators kann nicht garantiert werden, da es im Allgemeinen unmöglich ist, eine harte Garantie dafür zu treffen, ob es außerhalb der synchronen gleichzeitigen Änderungen gibt. Eine schnelle Ausfalloperation wird sein Bestes tun, um ConcurrentModificationException zu werfen. Daher ist es falsch, ein Programm zu schreiben, das von dieser Ausnahme abhängt, um die Richtigkeit solcher Operationen zu verbessern. Der richtige Weg ist: ConcurrentModificationException sollte nur zum Erkennen von Fehler verwendet werden.
Für jeden in Java verwendet tatsächlich Iterator zur Verarbeitung. Durch Iterator können Kollektionen während der Verwendung von Iterator nicht gelöscht werden. Dies führt dazu, dass der Iterator ConcurrentModificationException wirft.
Der richtige Weg
Beispiel:
public static void listIterator3 () {list <Integer> list = new ArrayList <Integer> (); list.add (1); list.add (2); list.add (2); list.add (3); list.add (4); Iterator <Ganzzahl> iT = list.Iterator (); while (it.hasnext ()) {Integer value = it.Next (); if (2 == value) {it.remove (); } System.out.println (Wert); } System.out.println (Wert); } System.out.println ("list =" + list.toString ()); }Ergebnis:
12234List = [1, 3, 4]
2. Löschen Sie Elemente während der Kartentraversal
Beispiele für den richtigen Ansatz:
public static void main (String [] args) {HashMap <String, String> map = new HashMap <String, String> (); map.put ("1", "test1"); map.put ("2", "test2"); map.put ("3", "test3"); map.put ("4", "test4"); // Vollständige Durchquerung von MAP für (Eintrag <String, String> Eintrag: map.entrySet ()) {System.out.printf ("Schlüssel: %s Wert: %s/r/n", Eintrag.getKey (), Eintrag.getValue ()); } // Löschen Sie den Element Iterator <map.Entry <String, String >> it = map.EntrySet (). Iterator (); while (it.hasNext ()) {map.Entry <String, String> Eintrag = it.next (); String key = Eintrag.getKey (); int k = Integer.ParseInt (Schlüssel); if (k%2 == 1) {System.out.printf ("Schlüssel löschen:%s Wert:%s/r/n", Schlüssel, Eintrag.getValue ()); it.remove (); }} // Vollständige Traverse -Karte für (Eintrag <String, String> Eintrag: map.EntrySet ()) {System.out.printf ("Schlüssel: %s Wert: %s/r/n", Eintrag.getkey (), Eintrag.getValue ()); }}Ergebnis:
Schlüssel: 1 Wert: Test1Key: 2 Wert: Test2Key: 3 Wert: test3Key: 4 Wert: test4Delete Key: 1 Wert: test1delete Key: 3 Wert: test3Key: 2 Wert: test2key: 4 Wert: test4
Beachten
Es gibt aber auch Dinge, auf die wir über remove() achten müssen:
Die Methode remove() iterator.next() () aufgerufen wird.
Vor dem Aufrufen der Methode remove() muss next() -Methode einmal aufgerufen werden.
Beschreibung der Methode REMET () in JDK-API:
void remove() entfernt das letzte vom Iterator zurückgegebene Element aus der Sammlung, auf die der Iterator (optionaler Betrieb) vermittelt wird. Diese Methode kann nur einmal pro Anruf als nächstes aufgerufen werden. Wenn der Iterator auf eine andere Weise modifiziert wird, als diese Methode beim Iterieren aufzurufen, ist das Verhalten des Iterators mehrdeutig.
Auswürfe: UnsupportedOperationException - Wenn der Iterator den Betrieb nicht remove . IllegalStateException - Wenn die next Methode nicht aufgerufen wurde oder die remove nach dem letzten Aufruf zur next Methode aufgerufen wurde.
Zusammenfassen
Bei dem oben genannten dreht sich alles um das Löschen von Elementen während des Durchquerens von Liste und Karte. Ich hoffe, dass der Inhalt dieses Artikels für das Studium oder die Arbeit eines jeden hilfreich sein wird. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.