Wenn LinkedHashMap.keySet() aufgerufen wird, wird die Bestellung des Sets kehrte die gleiche wie die Reihenfolge sein, die Schlüssel in zugesetzt?Hat Java's LinkedHashMap die Reihenfolge der Schlüssel?
Antwort
Ja.
Siehe: LinkedHashMap:
Diese verkettete Liste definiert die Iteration Bestellung, die normalerweise die Reihenfolge ist, in der Schlüssel in die Karte (Insertion Ordnung) eingefügt wurden.
und von der HashMap#keySet Dokumentation:
Das Set [Zurück] von der Karte unterstützt wird, so Änderungen an der Karte in den eingestellten reflektiert werden, und umgekehrt.
@Tom danke, ich bin immer noch nicht davon überzeugt, dass dies explizit ist. Warum gibt LinkedHashMap.keySet() keine Unterklasse von Set mit fester Reihenfolge zurück? – Armand
Denn wenn es eine SortedSet zurückgegeben, dann würde die Anforderung LinkedHashMap werden, indem das sein Schlüssel einer Art ist, die ein vergleichbares umsetzt, oder dass eine Komparatorfunktion geliefert werden. Dies wird von Map nicht benötigt. Überprüfen Sie die SortedSet-Dokumentation: http://download.oracle.com/javase/6/docs/api/java/util/SortedSet.html. Wenn diese Voraussetzung nicht erfüllt ist, können sogar Schlüssel, die Comparable nicht implementieren, in einer LinkedHashMap verwendet werden, was der allgemeinere Fall ist. Die Implementierung von LinkedHashMap kann sogar ein SortedSet zurückgeben, wenn ihre Schlüssel vergleichbar sind, aber es ist einfach nicht erforderlich. –
Natürlich sagt der Vertrag von LinkedHashMap, dass es INSERTION-Bestellung beibehält, die möglicherweise nicht die NATURAL-Bestellung ist. In diesem Fall würde ein SortedSet gar nicht funktionieren - die Schlüssel würden einfach nicht auf diese Weise sortiert. –
Yes. Wenn ein Schlüssel erneut eingefügt wird, wird die Ausnahme in der Reihenfolge angezeigt, in der er in die Liste eingefügt wurde.
+1 Guter Fang an diesem Eckfall. –
Eigentlich ist die Ausnahme, wenn der Schlüssel ** neu eingefügt **, nicht gelöscht und wiederverwendet wird.Der Fall ist, wenn Sie 'put (key, value)' für einen Schlüssel aufrufen, der bereits in der Map war. (Das Javadoc erklärt dies deutlich.) –
Für diejenigen von PHP kommen, lassen Sie mich ihnen helfen, mit dem Hinweis darauf, dass ein LinkedHashMap wie eine PHP-Array sehr verhält. –