Ist die Reihenfolge der HashMap-Elemente reproduzierbar?

8

Zunächst möchte ich klarstellen, dass ich niemals eine HashMap verwenden würde, um Dinge zu tun, die eine gewisse Ordnung in der Datenstruktur erfordern und dass diese Frage von meiner Neugier auf die inneren Details der Java HashMap-Implementierung motiviert ist .

Sie können in der Java-Dokumentation unter% nachlesen. co_de% über die Object Methode Object .

Ich verstehe von dort, dass die hashCode Implementierung für Klassen wie hashCode und Basistypen Wrapper ( String , Integer , ...) vorhersehbar ist, sobald der vom Objekt enthaltene Wert angegeben wird. Ein Beispiel hierfür wäre, dass Aufrufe von Long für ein beliebiges Objekt hashCode , das den Wert String enthält, immer zurückgeben: hello

Mit einem Algorithmus, der immer in eine leere Java HashMap einfügt, wobei 99162322 s als Schlüssel die gleichen Werte in der gleichen Reihenfolge verwendet. Dann sollte die Reihenfolge der Elemente am Ende immer gleich sein, liege ich falsch?

Da der Hash-Code für einen konkreten Wert immer gleich ist, sollte die Reihenfolge bei Kollisionen gleich sein. Andererseits, wenn es Kollisionen gibt, denke ich (ich weiß nicht die Tatsachen), dass die Kollisionsauflösungen in der gleichen Reihenfolge für genau die gleichen Eingabeelemente resultieren sollten.

Also, ist es nicht richtig, dass zwei HashMap-Objekte mit denselben Elementen, die in der gleichen Reihenfolge eingefügt werden, (durch einen Iterator) durchlaufen werden sollten, um die gleiche Elementsequenz zu erhalten?

    
Pablo Francisco Pérez Hidalgo 02.04.2014, 13:28
quelle

3 Antworten

6

Soweit ich weiß, wird die Reihenfolge (vorausgesetzt, wir nennen "Reihenfolge" die Reihenfolge der Elemente, wie von values() iterator zurückgegeben) der Elemente in HashMap beibehalten, bis die Map rehash ausgeführt wird. Wir können die Wahrscheinlichkeit dieses Ereignisses beeinflussen, indem wir dem Konstruktor capacity und / oder loadFactor zur Verfügung stellen.

Dennoch sollten wir uns nie auf diese Aussage verlassen, da die interne Umsetzung von HashMap kein Bestandteil des öffentlichen Auftrags ist und sich in Zukunft ändern kann.

    
Alexey Malev 02.04.2014, 13:36
quelle
2

Ich denke, Sie fragen "Ist HashMap nicht deterministisch?". Die Antwort lautet "wahrscheinlich nicht" (schauen Sie sich den Quellcode Ihrer bevorzugten Implementierung an).

Beachten Sie jedoch, dass der Java-Standard keine bestimmte Reihenfolge garantiert, so dass die Implementierung jederzeit geändert werden kann (z. B. in neueren JRE-Versionen), was zu einem anderen (aber deterministischen) Ergebnis führt.

    
Oliver Charlesworth 02.04.2014 13:34
quelle
0

Ob das wahr ist oder nicht, hängt vollständig von der Implementierung ab. Was noch wichtiger ist, ist, dass es nicht garantiert ist. Wenn Sie bestellen, ist es wichtig für Sie gibt es Optionen. Sie könnten Ihre eigene Implementierung von Map erstellen, die die Reihenfolge bewahrt, Sie können eine SortedMap / LinkedHashMap verwenden oder Sie können etwas wie den Apache commons-collections OrderedMap verwenden: Ссылка .

    
jgitter 02.04.2014 13:32
quelle

Tags und Links