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?
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.
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.
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: Ссылка .
Tags und Links java data-structures hashmap