Je sais qu'il LinkedHashMap
a un ordre d'itération prévisible (ordre d'insertion). Est-ce que le Set
retour par LinkedHashMap.keySet()
et le Collection
retour parLinkedHashMap.values()
maintiennent également cette commande?
java
iteration
linkedhashmap
user256239
la source
la source
values()
ainsi quekeySet()
, j'ai élargi la question pour inclure cela. Cela signifie que plus de questions peuvent être fermées en double.Réponses:
- Carte
- LinkedHashMap
Alors, oui,
keySet()
,values()
, etentrySet()
(les trois vues de mentioner) les valeurs de retour dans l'ordre des utilisations liste chaînée internes. Et oui, le JavaDoc pourMap
et leLinkedHashMap
garantir.C'est le but de cette classe, après tout.
la source
Collection
est juste la classe de base pour ce que renvoie values (). L'implémentation de la collection qu'il renvoie est toujours contrôlée par leLinkedHashMap
. Dans ceLinkedHashMap
cas, il renvoie uneLinkedValues
instance, une classe privée dans LinkedHashMap.java.Map
créer un lien vers la documentation (from ) qui lie explicitement l'ordre d'une carte aux itérateurs sur les vues de collection de la carte (et de préciser ce que sont ces vues de collection). C'était la pièce manquante pour moi.En regardant la source, on dirait que c'est le cas.
keySet()
,values()
etentrySet()
utilisent tous le même itérateur d'entrée en interne.la source
Ne vous confondez pas avec
LinkedHashMap.keySet()
etLinkedHashMap.entrySet()
revenir ensemble et donc il ne devrait pas garantir la commande!Set
est une interface avecHashSet
,TreeSet
etc. étant ses implémentations. L'HashSet
implémentation de l'Set
interface ne garantit pas la commande. Mais leTreeSet
fait. AussiLinkedHashSet
fait .Par conséquent, cela dépend de la manière dont
Set
a été implémentéeLinkedHashMap
pour savoir si la référence Set renvoyée garantira la commande ou non. J'ai parcouru le code source deLinkedHashMap
, il ressemble à ceci:Ainsi LinkedHashMap / HashMap a sa propre implémentation de
Set
ieKeySet
. Alors ne confondez pas cela avecHashSet
.En outre, l'ordre est maintenu par la manière dont les éléments sont insérés dans le seau. Regardez la
addEntry(..)
méthode deLinkedHashMap
et comparez-la avec celleHashMap
dont met en évidence la principale différence entreHashMap
etLinkedHashMap
.la source
Vous pouvez le supposer. Le Javadoc dit «ordre d'itération prévisible», et les seuls itérateurs disponibles dans une carte sont ceux pour keySet (), entrySet () et values ().
Donc, en l'absence de toute autre qualification, il est clairement destiné à s'appliquer à tous ces itérateurs.
la source
AFAIK il n'est pas documenté donc vous ne pouvez pas "formellement" le supposer. Il est cependant peu probable que la mise en œuvre actuelle change.
Si vous souhaitez assurer l'ordre, vous pouvez parcourir les entrées de la carte et les insérer dans un ensemble trié avec une fonction de commande de votre choix, bien que vous paierez naturellement un coût de performance.
la source
En regardant l'interface, il renvoie un simple
Set
et non unSortedSet
. Il n'y a donc aucune garantie.Avant d'assumer une garantie implicite en regardant l'implémentation (toujours une mauvaise idée) regardez également les implémentations dans toutes les autres implémentations Java :)
Vous pourriez mieux créer par exemple un TreeSet avec le keySet dans le constructeur.
la source
Je ne pense pas que vous puissiez présumer l'ordre de keySet () et values ().
Je peux facilement écrire une implémentation de LinkedHashMap qui vous renvoie keySet () et values () non ordonnés, tant que je m'en tiens au contrat de ces deux méthodes qui sont définies dans Map et remplacées dans HashMap.
la source
LinkedHashMap
classe est de conserver l'ordre des éléments lors de l'itération de la carte et ce comportement est bien spécifié. Si vous écrivez une sous-classe sans vous conformer à la spécification de la classe de base, vous faites quelque chose de très mal.