Was sind die grundlegenden Operationen auf einer Karte sind erlaubt während der Iteration über es?
Sagen, ich bin der Iteration über eine Karte in der Java... ich bin unklar, auf was kann ich zu dieser Karte, während in den Prozess, Durchlaufen ihn. Ich glaube, ich bin meistens verwirrt durch diese Warnung in der Javadoc für die Iterator-interface Methode entfernen:
[...] Das Verhalten eines iterator ist keine Angabe, wenn die zugrunde liegende Auflistung geändert wird, während die iteration im Gange ist, die auf andere Weise als durch den Aufruf dieser Methode.
Weiß ich sicher, dass ich aufrufen können Sie die remove-Methode ohne Probleme. Aber während der Iteration über die Map-Auflistung, kann ich:
-
Ändern Sie den Wert mit einem Schlüssel verbunden mit der Map-Klasse put (put mit einem vorhandenen key)?
-
Fügen Sie einen neuen Eintrag mit der Map-Klasse put (put mit einem neuen Schlüssel)?
-
Entfernen Sie einen Eintrag mit der Map-Klasse remove-Methode?
Meine Vermutung ist, dass kann ich wohl bedenkenlos tun, #1 (setzen, um einen vorhandenen Schlüssel), aber sicher nicht tun, #2 oder #3.
Dank im Voraus für die Klärung dieser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Iterator.remove()
, und wenn Sie ein entrySet iterator (der Karte.Eintrag) können SieMap.Entry.setValue()
. Alles andere und alle Wetten sind ausgeschaltet) - Sie sollte nicht ändern Sie die Karte direkt, und einige Kartennicht gestatten, dass eine oder beide der oben genannten Methoden.
Ausdrücklich, Ihren (1), (2) und (3) sind nicht zulässig.
Du könnte Weg mit Einstellung einer vorhandenen Schlüssel-Wert durch die
Map
Objekt, aber dieSet.iterator()
Dokumentation ausdrücklich vorausgesetzt, und es werden spezifische Umsetzung:Wenn Sie einen Blick auf die HashMap-Klasse, sehen Sie ein Feld namens 'modCount'. Dies ist, wie die Karte weiß, Wann es geändert wurde während der iteration. Jede Methode, die in Schritten modCount, wenn Sie Durchlaufen wird, weil es zu werfen, eine ConcurrentModificationException.
Das heißt, Sie KÖNNEN einen Wert in eine Karte, wenn der Schlüssel bereits vorhanden ist, effektiv aktualisieren den Eintrag mit dem neuen Wert:
Wenn Sie Fragen, ob Sie diese Operationen ausführen kann. 'sicher,' Sie don T haben zu viel sorgen, weil HashMap ist entworfen, um zu werfen, dass die ConcurrentModificationException, sobald es läuft in ein problem wie dieses. Diese Operationen fehlschlagen schnell; Sie nicht verlassen, die Karte in einem schlechten Zustand.
Gibt es keine Globale Antwort. Die map-Schnittstelle lassen Sie die Auswahl für die Nutzer. Leider, ich denke, dass alle Implementierungen des jdk verwenden, die fail-fast - Umsetzung (hier ist die definition von fail-fast, als Sie erklärte, in der HashMap Javadoc):
Im Allgemeinen, wenn Sie möchten, ändern Sie die Karte während der Iteration über es, sollten Sie verwenden Sie eine der iterator-Methoden. Ich habe nicht wirklich getestet, um zu sehen, ob #1 funktioniert, aber die anderen definitiv nicht.