Ich weiß, LinkedHashMap
hat eine vorhersehbare Iterationsreihenfolge (Einfügereihenfolge). Wird diese Bestellung auch von der Set
Rücksendung LinkedHashMap.keySet()
und der Collection
Rücksendung LinkedHashMap.values()
beibehalten?
java
iteration
linkedhashmap
user256239
quelle
quelle
values()
sowie ansprechenkeySet()
, habe ich die Frage um das erweitert. Dies bedeutet, dass weitere Fragen als Duplikate davon geschlossen werden können.Antworten:
- Karte
- LinkedHashMap
Also, ja,
keySet()
,values()
, undentrySet()
(die drei Sammel Ansichten erwähnt) Rückgabewerte in der Reihenfolge der internen verknüpften Liste Anwendungen. Und ja, das JavaDoc dafürMap
undLinkedHashMap
garantiert es.Das ist schließlich der Punkt dieser Klasse.
quelle
Collection
ist nur die Basisklasse für die Rückgabe von values (). Die Implementierung der zurückgegebenen Sammlung wird weiterhin von der gesteuertLinkedHashMap
. In diesemLinkedHashMap
Fall wird eineLinkedValues
Instanz zurückgegeben, eine private Klasse in LinkedHashMap.java.Map
) verlinken, die die Reihenfolge einer Karte explizit mit den Iteratoren in den Sammlungsansichten der Karte verknüpft (und klar macht, um welche Sammlungsansichten es sich handelt). Das war das fehlende Stück für mich.Wenn man sich die Quelle ansieht, sieht es so aus.
keySet()
,values()
UndentrySet()
alle verwenden die gleichen Eintrag Iterator intern.quelle
Verwechsle dich nicht mit
LinkedHashMap.keySet()
undLinkedHashMap.entrySet()
Rückkehr Set und daher sollte es keine Garantie für Ihre Bestellung!Set
ist eine Schnittstelle mitHashSet
,TreeSet
etc Wesen ihre Implementierungen. DieHashSet
Implementierung derSet
Schnittstelle garantiert keine Bestellung. AberTreeSet
tut es. AuchLinkedHashSet
tut.Daher hängt es davon ab, wie
Set
implementiert wurde, umLinkedHashMap
zu wissen, ob die zurückgegebene Set-Referenz die Bestellung garantiert oder nicht. Ich habe den Quellcode von durchgesehenLinkedHashMap
, es sieht so aus:Somit hat LinkedHashMap / HashMap eine eigene Implementierung von
Set
dhKeySet
. Verwechseln Sie dies also nicht mitHashSet
.Die Reihenfolge wird auch dadurch beibehalten, wie die Elemente in den Bucket eingefügt werden. Schauen Sie sich die
addEntry(..)
Methode von anLinkedHashMap
und vergleichen Sie sie mit der,HashMap
die den Hauptunterschied zwischenHashMap
und hervorhebtLinkedHashMap
.quelle
Das können Sie davon ausgehen. Der Javadoc sagt "vorhersehbare Iterationsreihenfolge", und die einzigen in einer Karte verfügbaren Iteratoren sind die für keySet (), entrySet () und values ().
In Ermangelung einer weiteren Qualifikation ist es eindeutig beabsichtigt, auf alle diese Iteratoren anzuwenden.
quelle
AFAIK ist nicht dokumentiert, so dass Sie dies nicht "formal" annehmen können. Es ist jedoch unwahrscheinlich, dass sich die derzeitige Implementierung ändert.
Wenn Sie die Reihenfolge sicherstellen möchten, können Sie die Karteneinträge durchlaufen und sie in ein sortiertes Set mit einer Bestellfunktion Ihrer Wahl einfügen, obwohl Sie natürlich die Leistungskosten bezahlen.
quelle
Wenn Sie sich die Benutzeroberfläche ansehen, wird eine Ebene
Set
und keine zurückgegebenSortedSet
. Es gibt also keine Garantien.Bevor Sie eine implizite Garantie übernehmen, indem Sie sich die Implementierung ansehen (immer eine schlechte Idee), schauen Sie sich auch die Implementierungen in allen anderen Java-Implementierungen an :)
Sie können beispielsweise ein TreeSet mit dem keySet im Konstruktor erstellen.
quelle
Ich glaube nicht, dass Sie die Reihenfolge von keySet () und values () annehmen können.
Ich kann leicht eine Implementierung von LinkedHashMap schreiben, die Ihnen ungeordnetes keySet () und values () zurückgibt, solange ich mich an den Vertrag dieser beiden Methoden halte, die in Map definiert und in HashMap überschrieben werden.
quelle
LinkedHashMap
Klasse besteht darin, die Reihenfolge der Elemente während der Iteration der Karte beizubehalten, und dieses Verhalten ist genau spezifiziert. Wenn Sie eine Unterklasse schreiben, ohne die Basisklassenspezifikation einzuhalten, machen Sie etwas sehr Falsches.