Warum druckt sich die toString-Funktion einer HashMap in einer anderen Reihenfolge?

8

Ich habe dieses sehr einfache Stück Code, und ich habe nur versucht, ein bisschen mit verschiedenen Arten von Objekten in einer Map zu spielen.

%Vor%

Und dann erwarte ich von der Konsole etwas wie:

%Vor%

Aber überraschenderweise habe ich dieselben Daten in unterschiedlicher Reihenfolge:

%Vor%

Es spielt keine Rolle, ob ich andere Arten von Objekten versuche, auch nur Strings oder numerische Typen, es macht immer dasselbe, es macht eine andere, scheinbar sinnlose Ordnung.

Kann mir jemand einen Hinweis geben, warum das passiert? Oder kann etwas zu offensichtlich sein, dass ich vermisse?

Ich benutze Java 1.7 und Eclipse Juno.

    
unmultimedio 13.09.2013, 04:38
quelle

5 Antworten

13

Gemäß Oracle-Dokumentation

  

Die HashMap-Klasse entspricht in etwa Hashtable, außer dass sie nicht synchronisiert ist und Nullen zulässt. Diese Klasse gibt keine Garantien hinsichtlich der Reihenfolge der Karte; Insbesondere garantiert es nicht, dass der Auftrag über die Zeit konstant bleibt.

Siehe HashMap JavaDocs.

    
Vimal Bera 13.09.2013, 04:42
quelle
15

Es gibt 3 Klassen, die die Map-Schnittstelle in Java implementieren. 1. hashMap: Id garantiert keine Bestellung. 2. Linked HashMap: Es speichert sie in Anzeigenreihenfolge. 3. TreeMap: Es wird in aufsteigender Reihenfolge gespeichert. (ASCII-Wert)

So können Sie gemäß Ihrer Anforderung Linked HashMap anstelle von HashMap.so verwenden, anstatt

zu schreiben %Vor%

Erstelle ein Objekt von Linked HashMap

%Vor%

folgen Sie untenstehenden Link für weitere Informationen.

Ссылка

    
Anuj Kumar Jha 13.09.2013 04:48
quelle
2

HashMap garantiert nicht die Reihenfolge des Elements. Wenn Sie die Bestellnummer beibehalten möchten, LinkedHashMap .

Siehe folgenden Fall

%Vor%

Ausgabe:

%Vor%     
Ruchira Gayan Ranaweera 13.09.2013 04:44
quelle
1

Maps behält nicht die Reihenfolge der Reihenfolge bei, in der Elemente hinzugefügt wurden, List verwaltet die Reihenfolge der Elemente

"Die Reihenfolge einer Map ist definiert als die Reihenfolge, in der die Iteratoren in den Auflistungsansichten der Map ihre Elemente zurückgeben. Einige Map-Implementierungen, wie die TreeMap-Klasse, geben bestimmte Garantien für ihre Reihenfolge, andere wie die HashMap-Klasse , nicht. "

    
upog 13.09.2013 04:42
quelle
0

So funktioniert eine Hashmap: (aus einer anderen Quelle zitierend)

Es enthält eine Reihe von "Buckets", in denen Schlüssel-Wert-Paare gespeichert werden. Jeder Bucket hat eine eindeutige Nummer - das ist der Name des Buckets. Wenn Sie ein Schlüssel / Wert-Paar in die Karte einfügen, wird die Hashmap den Hash-Code des Schlüssels betrachten und das Paar in dem Bucket speichern, dessen Bezeichner der Hash-Code des Schlüssels ist. Zum Beispiel: Der Hash-Code des Schlüssels ist 235 - & gt; das Paar wird in der Bucket-Nummer 235 gespeichert. (Beachten Sie, dass ein Bucket mehr als ein Schlüssel / Wert-Paar speichern kann).

Wenn Sie einen Wert in der Hashmap suchen, indem Sie ihm einen Schlüssel geben, wird er zuerst den Hash-Code des Schlüssels betrachten, den Sie angegeben haben. Die Hashmap wird dann in den entsprechenden Bucket schauen und dann den Schlüssel, den Sie angegeben haben, mit den Schlüsseln aller Paare im Bucket vergleichen, indem Sie sie mit equals () vergleichen.

Nun können Sie sehen, wie dies sehr effizient ist, um Schlüssel-Wert-Paare in einer Map nachzuschlagen: Durch den Hash-Code des Schlüssels weiß die Hashmap sofort, in welchem ​​Bucket sie aussehen soll, so dass sie nur testen muss, was drin ist dieser Eimer.

Wenn Sie sich den obigen Mechanismus ansehen, können Sie auch sehen, welche Anforderungen an die Methoden hashCode() und equals() der Schlüssel erforderlich sind:

  • Wenn zwei Schlüssel identisch sind (equals () gibt true zurück, wenn Sie sie vergleichen), muss ihre Methode hashCode () dieselbe Zahl zurückgeben. Wenn Schlüssel dies verletzen, dann könnten Schlüssel, die gleich sind, in verschiedenen Buckets gespeichert werden, und die Hashmap wäre nicht in der Lage, Schlüssel / Wert-Paare zu finden (weil es in demselben Bucket aussehen wird).

  • Wenn zwei Schlüssel unterschiedlich sind, ist es egal, ob ihre Hash-Codes gleich sind oder nicht. Sie werden im gleichen Bucket gespeichert, wenn ihre Hash-Codes identisch sind. In diesem Fall wird die hashmap equals () verwenden, um sie voneinander zu unterscheiden.

Wenn Sie nun alle Ihre "Schlüssel-Wert" -Paare in die Hash-Map einfügen und diese drucken, werden sie in zufälliger Reihenfolge der Schlüssel gedruckt, die durch Hashing des Werts Sie erzeugt wurden für Schlüssel.

Wenn Ihre Anforderung noch ist, um die Reihenfolge beizubehalten, können Sie das LinkedHashMap in Java verwenden.

Hoffe das hilft: -)

Bearbeiten: Original Post: Wie behandelt eine Java HashMap verschiedene Objekte mit dem gleichen Hash-Code?

    
VictorCreator 13.09.2013 04:49
quelle

Tags und Links