Ist die Java HashMap keySet () Iterationsreihenfolge konsistent?
Verstehe ich, dass der Satz wieder von einer Karte keySet () - Methode garantiert in keiner bestimmten Reihenfolge.
Meine Frage ist, garantiert Sie die gleichen, um über mehrere Iterationen. Zum Beispiel
Map<K,V> map = getMap();
for( K k : map.keySet() )
{
}
...
for( K k : map.keySet() )
{
}
In dem obigen code, vorausgesetzt, dass die Karte nicht verändert, wird die iteration über die keySets werden in der gleichen Reihenfolge. Mit Sonne jdk15 es hat Durchlaufen in der gleichen Reihenfolge, aber bevor ich bin angewiesen auf dieses Verhalten, ich würde gerne wissen, ob alle JDKs wird das gleiche tun.
BEARBEITEN
Ich sehe aus den Antworten, dass ich nicht von ihm abhängen. Schade. Ich hatte gehofft, zu bekommen Weg mit nicht mit, um aufzubauen, einige neue Kollektion garantieren meine Bestellung. Mein code, der benötigt wird, um Durchlaufen, tun eine gewisse Logik, und Durchsuche dann wieder mit der gleichen Anordnung. Ich werde einfach erstellen Sie eine neue ArrayList vom keySet die Garantie um.
InformationsquelleAutor der Frage karoberts | 2009-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es nicht ausdrücklich garantiert werden, die in der API-Dokumentation, dann sollten Sie nicht davon abhängig sind. Das Verhalten möglicherweise ändern sich sogar von einem release des JDK auf die nächste, auch vom gleichen Verkäufer JDK.
Könnte man leicht bekommen das set, und dann einfach Sortieren Sie selbst, richtig?
InformationsquelleAutor der Antwort Ken Liu
Können Sie eine LinkedHashMap wenn Sie möchten, eine HashMap, deren iteration Bestellung nicht ändern.
Darüber hinaus sollten Sie immer verwenden, wenn Sie eine Iteration durch die Sammlung. Iteration über HashMap ' s entrySet oder keySet ist viel langsamer als über LinkedHashMap.
InformationsquelleAutor der Antwort ciamej
Karte ist nur eine Schnittstelle (eher als eine Klasse), was bedeutet, dass die zugrunde liegende Klasse, die es (und gibt es viele) könnte sich anders Verhalten, und der Vertrag für die keySet() in der API nicht zeigen, dass konsistente iteration erforderlich ist.
Wenn Sie auf der Suche auf eine bestimmte Klasse, die Map (HashMap, LinkedHashMap, TreeMap, etc) dann könnte man sehen, wie es implementiert die keySet () - Funktion, um zu bestimmen, was das Verhalten wäre durch die überprüfung der Quelle, Sie würde wirklich nehmen einen Blick auf den Algorithmus, um zu sehen, ob die Immobilie, die Sie suchen, ist erhalten (das heißt, konsistente iteration um, wenn die Karte hat keine Einträge/Umzüge zwischen den Iterationen). Die Quelle für HashMap, zum Beispiel, ist hier (open JDK 6): http://www.docjar.com/html/api/java/util/HashMap.java.html
Könnte es sehr unterschiedlich von einem JDK auf die nächste, so dass ich definitiv nicht darauf verlassen.
Dass gesagt wird, wenn konsistente iteration um etwas, was Sie wirklich brauchen, möchten Sie vielleicht versuchen, eine LinkedHashMap.
InformationsquelleAutor der Antwort mpobrien
Die API für die Karte keine Garantie alle Bestellung zu löschen, auch zwischen mehreren aufrufen der Methode auf das gleiche Objekt.
In der Praxis würde ich mich sehr Wundern, wenn die iteration der Bestellung geändert für mehrere nachfolgende Aufrufe (vorausgesetzt, die Karte an sich nicht geändert hat in zwischen) - aber man sollte nicht (und gemäß der API nicht) auf diese angewiesen sind.
BEARBEITEN - wenn Sie möchten, verlassen Sie sich auf die iteration, um Sie beständig, dann werden Sie wollen eine SortedMap bietet genau diese Garantien.
InformationsquelleAutor der Antwort Andrzej Doyle
Nur zum Spaß, habe ich beschlossen, schreiben Sie einen code, die Sie verwenden können, um zu garantieren zufälliger Reihenfolge jedes mal. Dies ist nützlich, so dass Sie fangen kann, Fälle, in denen Sie je nach der Ordnung, aber Sie sollte nicht sein. Wenn Sie möchten, richten sich nach der Ordnung, als wie andere gesagt haben, sollten Sie eine SortedMap. Wenn Sie nur eine Karte und verlassen sich auf, um dann mit dem folgenden RandomIterator fangen. Ich würde nur im testen von code, da es die Verwendung von mehr Arbeitsspeicher dann nicht tun würde.
Könnten Sie auch wickeln Sie die Karte (oder das Set) zu haben Sie wieder die RandomeIterator das wäre dann aber können Sie die Verwendung der for-each-Schleife.
InformationsquelleAutor der Antwort TofuBeer
Hashmap nicht garantieren, dass die Reihenfolge der anzeigen wird in Laufe der Zeit konstant bleiben.
InformationsquelleAutor der Antwort Amir Afghani
Muss es nicht sein. Eine Karte, die keySet-Funktion gibt einen Satz und der set-iterator-Methode, sagt dieser in seiner Dokumentation:
"Gibt einen iterator über die Elemente in diesem set. Die Elemente zurückgegeben werden, in keiner bestimmten Reihenfolge (es sei denn dieses set ist eine Instanz einer Klasse, die bietet eine Garantie)."
So, es sei denn, Sie sind mit einer dieser Klassen mit einer Garantie, es gibt keine.
InformationsquelleAutor der Antwort Jeff Storey
Map ist ein interface, und es definiert nicht in der Dokumentation, um die gleiche sein sollte. Das bedeutet, dass Sie können nicht Sie verlassen sich auf die Bestellung. Aber wenn Sie die control Map-Implementierung zurück, getMap(), dann können Sie LinkedHashMap oder TreeMap und Holen Sie sich die gleiche Reihenfolge der Schlüssel/Werte, die alle die Zeit, die Sie Durchlaufen.
InformationsquelleAutor der Antwort Andrey Adamovich
Logisch, wenn der Vertrag sagt "keiner bestimmten Reihenfolge gewährleistet ist", und seit "der Orden kam es aus einer Zeit" ist ein bestimmten Reihenfolge, dann ist die Antwort Nein, können Sie nicht abhängen, es kommt auf die gleiche Weise zweimal.
InformationsquelleAutor der Antwort Jonathan Feinberg
Ich Stimme mit LinkedHashMap Sache. Nur darum, meine Erkenntnisse und Erfahrungen, und ich Stand vor dem problem, wenn ich versuche zu Sortieren HashMap mit den Tasten.
Mein code zum erstellen der HashMap:
Habe ich eine Funktion showMap die Drucke Einträge anzeigen:
Wenn ich jetzt drucken Sie die Karte vor der Sortierung, druckt es folgende Reihenfolge:
Ist grundsätzlich anders als die Reihenfolge, in der die map-Schlüssel gesetzt wurden.
Wenn ich jetzt Sortieren mit Karte-Tasten:
die ausgeschrieben ist:
Sehen Sie den Unterschied in der Reihenfolge der Tasten. Sortierter Reihenfolge der Schlüssel in Ordnung ist aber, dass der Schlüssel der kopierten Karte ist wieder in der gleichen Reihenfolge auf die früheren anzeigen. Ich weiß nicht, ob diese gültig ist, zu sagen, aber für zwei hashmap mit den gleichen Tasten die Reihenfolge der Tasten ist gleich. Dies impliziert die Aussage, dass die Reihenfolge der keys ist nicht garantiert, sondern kann gleich für zwei Karten mit dem gleichen Schlüssel, die aufgrund der inhärenten Natur der key insertion-Algorithmus, wenn die HashMap-Implementierung dieser JVM-version.
Wenn ich jetzt LinkedHashMap verwenden, zu kopieren, sortierte Einträge HashMap, ich bekomme gewünschte Ergebnis (was natürlich, aber das ist nicht der Punkt. Punkt ist bezüglich der Reihenfolge der keys von HashMap)
Ausgabe:
InformationsquelleAutor der Antwort user2214297
Können Sie auch speichern Sie die Set-Instanz zurückgegeben, die von keySet () - Methode und können diese Instanz, wenn Sie müssen die gleiche Reihenfolge.
InformationsquelleAutor der Antwort Shivang Agarwal