Ist die Reihenfolge der aus einer HashMap abgerufenen Werte die Einfügungsreihenfolge

Lesezeit: 4 Minuten

Ist die Reihenfolge der aus einer HashMap abgerufenen Werte die
javagurl

Ich versuche herauszufinden, in welcher Reihenfolge die Werte in einer HashMap abgerufen werden/können. Hier ist das Code-Snippet für dasselbe.

import java.util.HashMap;

public class HashMapExample {

   public static void main(String[] args) {
       HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
       hashmap.put(1, "apple" );
       hashmap.put(2, "lemon" );
       hashmap.put(3, "orange" );
       hashmap.put(4, "banana" );
       hashmap.put(5, "litchi" );
       hashmap.put(6, "mango" );
       hashmap.put(7, "papaya" );

       System.out.println(hashmap.size());

       for (String key : hashmap.values()) {
           System.out.println(key);
       }
   }
}

Ausgang:

7
apple
lemon
orange
banana
litchi
mango
papaya

Die Werte werden in der Reihenfolge gedruckt, in der sie eingefügt wurden. Stimmt das generell? Ich hatte erwartet, dass die Werte in einer willkürlichen Reihenfolge gedruckt werden. Dies verwendet Java 6.

  • Verwenden Sie einfach eine LinkedHashMap.

    – Verschränkte Schleifen

    30. September 2015 um 14:19 Uhr

  • @Raedwald Okay, aber sie hat mehrmals nach der Reihenfolge der Einfügungen gefragt, und es scheint, als wäre LinkedHashMap wahrscheinlich einen Blick wert.

    – Verschränkte Schleifen

    20. November 2017 um 16:17 Uhr

1646244427 66 Ist die Reihenfolge der aus einer HashMap abgerufenen Werte die
nichtnoop

Aus dem Javadoc: HashMap “Klasse gibt keine Garantien für die Reihenfolge der Karte; insbesondere garantiert sie nicht, dass die Reihenfolge im Laufe der Zeit konstant bleibt.”

Wenn Sie eine konsistente Reihenfolge benötigen, können Sie verwenden LinkedHashMap (für Einfügungs-/Zugriffsreihenfolge) oder TreeMap (für Vergleichsauftrag). Bitte beachten Sie, dass diese die Reihenfolge der Schlüssel beibehalten, nicht die Werte.

  • Ich denke, das OP hat gefragt, warum die HashMap erscheint um die Reihenfolge der Einfügungen in seinem Anwendungsfall beizubehalten. Es ist klar, dass er es war erwarten die Iterationsreihenfolge willkürlicher sein.

    – Stefan C

    26. November 2012 um 11:02 Uhr

  • Obwohl die Reihenfolge für die Schlüssel gilt, speichern die meisten dieser Zuordnungen tatsächlich Schlüssel/Wert-Einträge (Map.Entry). Daher erscheinen Werte meistens auch in der gleichen Reihenfolge wie ihre zugehörigen Schlüssel.

    – Chris Jester-Young

    25. August 2013 um 17:56 Uhr

1646244427 707 Ist die Reihenfolge der aus einer HashMap abgerufenen Werte die
Stefan C

Die Werte werden in der Reihenfolge gedruckt, in der sie eingefügt wurden. Stimmt das generell? Ich hatte erwartet, dass die Werte in zufälliger Reihenfolge gedruckt werden.

Die HashMap API definiert nicht die Reihenfolge der Iteration.

Wenn Sie sich jedoch die Implementierung von HashMap ansehen, können Sie ableiten, dass es eine komplexe transiente Beziehung zwischen der Iterationsreihenfolge, den Hash-Werten der Schlüssel, der Reihenfolge, in der die Schlüssel eingefügt wurden, und der Größe der Hashtabelle gibt. Diese Beziehung wird durcheinander gebracht, wenn sich die Größe der Hashtabelle selbst ändert.

In Ihrem Fall verwenden Sie Integer Schlüssel, was bedeutet, dass die Hash-Werte der Schlüssel die Schlüsselwerte selbst sind. Außerdem haben Sie die Einträge in Schlüsselreihenfolge eingefügt. Dies führt (zufällig!) dazu, dass die Iterationsreihenfolge mit der Einfügungsreihenfolge übereinstimmt. Wenn Sie jedoch weitere Schlüssel einfügen, werden Sie feststellen, dass sich die Iterationsreihenfolge “umwickelt”. Wenn die Tabelle dann eine Reihe von Größenänderungen durchläuft, wird die Reihenfolge immer mehr und mehr durcheinander gebracht.

Kurz gesagt, was Sie sehen, ist ein Artefakt der Hashtable-Implementierung und nicht etwas, das Sie sinnvoll nutzen können (oder sollten). Nicht zuletzt, weil es könnten Wechsel von einer Java-Version zur nächsten.

EIN LinkedHashMap ist, was Sie suchen. Von der Doku, es unterscheidet sich von HashMap dadurch, dass es eine doppelt verknüpfte Liste führt, die alle seine Einträge durchläuft

Probieren Sie LinkedHashMap aus, wenn die Reihenfolge wichtig ist … siehe JavaDoc

Die öffentliche Klasse LinkedHashMap erweitert HashMap

Hashtabellen- und Linked-List-Implementierung der Map-Schnittstelle mit vorhersagbarer Iterationsreihenfolge. Diese Implementierung unterscheidet sich von HashMap darin, dass sie eine doppelt verknüpfte Liste verwaltet, die alle ihre Einträge durchläuft. Diese verknüpfte Liste definiert die Iterationsreihenfolge, die normalerweise die Reihenfolge ist, in der Schlüssel in die Abbildung eingefügt wurden (Einfügungsreihenfolge). Beachten Sie, dass die Einfügereihenfolge nicht beeinflusst wird, wenn ein Schlüssel erneut in die Karte eingefügt wird. (Ein Schlüssel k wird wieder in eine Map m eingefügt, wenn m.put(k, v) aufgerufen wird, wenn m.containsKey(k) unmittelbar vor dem Aufruf true zurückgeben würde.)

Eine verwandte Sammlung ist die von java.util.concurrent ConcurrentSkipListMap. EIN Skipliste ermöglicht es Ihnen, die Einträge in Schlüsselreihenfolge zu durchlaufen und sie auch in zufälliger Reihenfolge anzuzeigen (aber nicht so schnell wie eine HashMap).

Es gibt eine schöne Skiplist Demo-Applet.

Ist die Reihenfolge der aus einer HashMap abgerufenen Werte die
Dewansh Nigam

Nein, die Reihenfolge wird bei HashMap nicht beibehalten (wenn Sie eine sortierte Implementierung wünschen). Falls Sie möchten, dass Schlüssel sortiert werden, können Sie TreeMap verwenden.

zum Beispiel – {[3=1],[2=50],[20=4],[14=1]} -> HashMap

für TreeMap erhalten Sie – {[2=50],[3=1],[14=1],[20=4]} -> Baumkarte

914730cookie-checkIst die Reihenfolge der aus einer HashMap abgerufenen Werte die Einfügungsreihenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy