Warum toString-Funktion eines HashMap druckt sich mit einer anderen Reihenfolge?
Habe ich diese sehr einfache Stück code, und ich war gerade versucht zu spielen ein bisschen mit verschiedenen Arten von Objekten in einer Karte.
//There's a bit of spanish, sorry about that
//just think 'persona1' as an object with
//a string and an int
Map mapa = new HashMap();
mapa.put('c', 12850);
mapa.put(38.6, 386540);
mapa.put("Andrés", 238761);
mapa.put(14, "Valor de 14");
mapa.put("p1", persona1);
mapa.put("Andrea", 34500);
System.out.println(mapa.toString());
Und dann erwarte ich von der Konsole etwas wie:
{c=12850, 38.6=386540, Andrés=238761, 14=Valor de 14, p1={nombre: Andres Perea, edad: 10}, Andrea=34500}
Aber susprisingly für mich, ich bekam dieselben Daten in einer anderen Reihenfolge:
{38.6=386540, Andrés=238761, c=12850, p1={nombre: Andres Perea, edad: 10}, Andrea=34500, 14=Valor de 14}
Ist es egal, ob ich versuche andere Art von Objekten, die auch nur Strings oder numerische Typen, die es immer das gleiche macht, macht es eine andere, ohne-scheinbar-alle-Sinne um.
Kann jemand mir einen Tipp geben, warum dies passiert? Oder kann etwas zu offensichtlich bin ich vermisst?
Ich bin mit Java 1.7 und Eclipse Juno.
- intern verwendet es array zum speichern der Werte, und diese Werte sind eingefügt in der index berechnet wird, indem eine hash-Funktion wandelt die Schlüssel zum index..So ist die Reihenfolge ändern würde, je nach Schlüssel.
- das ist ein schönes Stück info, ich werde versuchen, einige änderungen zu sehen, wie er reagiert
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als pro Oracle-Dokumentation
Finden HashMap JavaDocs.
Gibt es 3 Klassen, die map-Schnittstelle implementiert in java.
1. hashMap: - Id garantiert keine Ordnung.
2. Verbunden HashMap:Es wird speichern Sie in der insertion order.
3. TreeMap: Es wird Speicher in aufsteigender Reihenfolge.(ASCII-Wert)
So, Wie pro Ihre Anforderung, die Sie verwenden können, Verbunden HashMap statt HashMap.also statt zu schreiben
Objekt erstellen von Verknüpften HashMap
Folgen Sie folgenden link für mehr info.
http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html
HashMap nicht garantiert werden, die Reihenfolge der element. Wenn Sie wollen, um Ordnung zu halten, verwenden LinkedHashMap.
Siehe folgende Fall
Ausgabe:
HashMap
nicht sortiert die Einträge nach Schlüssel.Karten nicht halten Sie die Reihenfolge, in der Reihenfolge, in der die Elemente wurden Hinzugefügt, Liste wird die Reihenfolge der Elemente
"Die Bestellung einer Karte ist definiert als die Reihenfolge, in der die Iteratoren auf der Karte, Sammlung Aussicht auf Rückgabe Ihrer Elemente. Einige map-Implementierungen, wie die TreeMap Klasse, machen spezifische Garantien auf Ihre Reihenfolge an; andere, wie die HashMap-Klasse, die dies nicht tun."
Dies ist, wie eine hashmap funktioniert: (zitiert aus einer anderen Quelle)
Es hat eine Reihe von "Eimer", die er verwendet zum speichern von Schlüssel-Wert-Paaren. Jede Gruppe hat eine eindeutige Nummer - das ist, was kennzeichnet den Eimer. Wenn Sie einen Schlüssel-Wert-paar in die map, die hashmap wird sich mit dem hash-code der Taste, und speichern Sie das paar in die Eimer, die die id ist der hash-code des Schlüssels. Zum Beispiel: Die hash-code des Schlüssels 235 -> das paar ist gespeichert in bucket Nummer 235. (Beachten Sie, dass ein Eimer wird, speichern kann mehr als ein Schlüssel-Wert-paar).
Wenn Sie eine lookup-Wert in der hashmap, indem Sie eine Taste, es wird der erste Blick auf die hash-code der Taste, die Sie gab. Die hashmap wird dann schauen Sie in die entsprechenden Eimer, und es wird dann vergleichen Sie die Taste, die Sie gab die Schlüssel alle Paare im Eimer, durch den Vergleich mit equals().
Nun können Sie sehen, wie diese ist sehr effizient, um die Schlüssel-Wert-Paare in einer map: von der hash-code der Taste, die hashmap sofort weiß, in welchem Eimer zu suchen, so dass es nur zum testen, gegen was ist in diesem Eimer.
Blick auf den obigen Mechanismus können Sie auch sehen, welche Voraussetzungen notwendig sind, auf die
hashCode()
undequals()
Methoden der Tasten:Wenn zwei Schlüssel sind gleich (equals() gibt true zurück, wenn Sie Sie vergleichen), deren hashCode () - Methode muss wieder die gleiche Nummer. Wenn die Schlüssel verletzen, dann werden die Tasten, die gleich sind, gespeichert werden könnten, in unterschiedliche Eimer, und die hashmap wäre nicht in der Lage zu finden, die Schlüssel-Wert-Paaren (weil es geht, schauen Sie sich in den gleichen Eimer).
Wenn zwei keys unterschiedlich sind, dann ist es nicht egal, wenn Ihre hash-codes sind die gleichen oder nicht. Sie werden gespeichert in den gleichen Eimer, wenn Ihre hash-codes sind die gleichen, und in diesem Fall die hashmap verwenden equals() zu sagen, Sie auseinander.
Nun, wenn Sie all Ihre "Schlüssel-Wert" - Paare in die hashmap, und drucken Sie Sie, es gibt Sie in einige zufällige Reihenfolge der Schlüssel, die generiert wird, indem hashing der Wert Sie mitgelieferten Schlüsseln.
Wenn Ihre Forderung noch um die Anordnung, die Sie verwenden können, die
LinkedHashMap
in Java.Hoffe, das hilft 🙂
Edit: Original Post: Wie funktioniert ein Java-HashMap behandeln verschiedene Objekte mit demselben hash-code?