Garantiert entrySet () in einer LinkedHashMap auch die Bestellung?


70

Ich verwende eine linkedHashMap, um die Bestellung zu garantieren, wenn jemand versucht, darauf zuzugreifen. Wenn es jedoch an der Zeit ist, darüber zu iterieren, garantiert die Verwendung von entrySet () zur Rückgabe von Schlüssel / Wert-Paaren auch die Reihenfolge? Während der Iteration werden keine Änderungen vorgenommen.

BEARBEITEN: Gibt es auch nachteilige Auswirkungen beim Durchlaufen der Karte durch Durchlaufen der Schlüssel und Aufrufen von get?


Ich wollte gerade die gleiche Frage stellen, aber warum sollte ich sie stellen, wenn bereits jemand anderes eine gute Antwort gestellt und erhalten hat? +1 für eine gute Frage.
uTubeFan

In LinkedHashMap können Sie die Einfügereihenfolge und die Zugriffsreihenfolge verwenden. Die Bestellung wird immer gepflegt. Bitte decken Sie mein internes Leben von LinkedHashMap Tutorial
Volodymyr Levytskyi

Antworten:


54

Laut den Javadocs ja.

Diese Implementierung unterscheidet sich HashMapdarin, dass sie eine doppelt verknüpfte Liste führt, 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 Karte eingefügt wurden ( Einfügereihenfolge ).

Nein, die Bearbeitung sollte einwandfrei funktionieren. Der Eintragssatz ist jedoch etwas schneller, da der Aufwand für das Nachschlagen aller Schlüssel in der Karte während der Iteration vermieden wird.


15
aber entrySet gibt ein Set zurück, das selbst ungeordnet ist?
Jonathan.

6
Ja, technisch gesehen hat das entrySet selbst keine Möglichkeit, auf eine Position zuzugreifen, entrySet.iterator () jedoch. Der Iterator gibt uns eine geordnete Liste.
Jpatrick

3
Ich würde gerne wissen, dass diese Antwort richtig ist, aber wie Jonathan betonte, entrySet()gibt er ein Set zurück. Laut Jpatrick können wir mit dem Iterator des Sets eine geordnete Liste erstellen, aber docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator () sagt: "Die Elemente werden in keiner bestimmten Reihenfolge zurückgegeben (es sei denn Dieses Set ist eine Instanz einer Klasse, die eine Garantie bietet. " Und keines der Dokumente, auf die hier verwiesen wird, besagt, dass entrySet () ein Set zurückgibt, das eine Instanz einer Klasse ist, die die Reihenfolge garantiert. Vermisse ich etwas
LarsH

1
Michael Myers weist zu Recht auf die Dokumentation hin, in der angegeben ist, dass die LinkedHashMap eine Iterationsreihenfolge definiert, aber nicht, wie auf diese Reihenfolge zugegriffen werden soll. entrySet().iterator()ist ein plausibler Weg, aber kann man sich darauf verlassen?
LarsH

5
Hier finden Sie eine endgültige Antwort: stackoverflow.com/a/2924143/423105 "Die Reihenfolge einer Karte ist definiert als die Reihenfolge, in der die Iteratoren in den Sammlungsansichten der Karte ihre Elemente zurückgeben." - Javadoc fürMap
LarsH

1

Diese verknüpfte Liste definiert die Iterationsreihenfolge, die normalerweise die Reihenfolge ist, in der Schlüssel in die Karte eingefügt wurden (Einfügereihenfolge). 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 erneut in eine Karte m eingefügt, wenn m.put (k, v) aufgerufen wird, wenn m.containsKey (k) unmittelbar vor dem Aufruf true zurückgeben würde.)


1

Wenn Sie sicher sind, dass während der Iteration keine Änderungen vorgenommen werden, ist die ordnungsgemäße Bestellung mit entrySet()garantiert, wie in der API angegeben .


2
Die API-Dokumente, auf die Sie verlinkt entrySet()haben, sagen nichts über die Gewährleistung einer ordnungsgemäßen Bestellung aus. Die einzige verwandte Aussage auf dieser Seite lautet: "Diese Klasse [dh HashMap] übernimmt keine Garantie für die Reihenfolge der Karte; insbesondere garantiert sie nicht, dass die Reihenfolge über die Zeit konstant bleibt." Worauf haben Sie sich mit diesem Link bezogen?
LarsH
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.