Est de l'ordre de la garantie pour la restitution des clefs et des valeurs à partir d'une LinkedHashMap objet?
Je sais LinkedHashMap
a un prévisible itération de l'ordre (la commande d'insertion). Le Set
retourné par LinkedHashMap.keySet()
et la Collection
retourné par LinkedHashMap.values()
également à maintenir cet ordre?
- Depuis toutes les réponses aborder la question de la
values()
ainsi quekeySet()
, j'ai élargi la question de l'inclure. Cela signifie plus de questions peut être fermé comme un duplicata de ce.
Vous devez vous connecter pour publier un commentaire.
-- Carte
-- LinkedHashMap
Donc, oui,
keySet()
,values()
, etentrySet()
(les trois vues de la collection mentionné) les valeurs de retour dans l'ordre interne lié liste utilise. Et oui, la JavaDoc deMap
etLinkedHashMap
garantie.C'est le point de cette classe, après tout.
LinkedHashMap
. DansLinkedHashMap
's cas, elle retourne unLinkedValues
instance, d'une salle de classe à l'intérieur de LinkedHashMap.java.Map
) qui explicite les liens de l'ordre d'une carte pour les itérateurs sur le plan de la collecte des points de vue (et de rendre clair ce que ces vues de la collection). C'est la pièce manquante pour moi.LinkedEntrySet
(bien que la javadoc ne spécifie elle renvoie uneSet
, etSet
s ne sont pas censés avoir itération afin de garantir, de sorte que le doc pourrait être plus clair). Voir grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/...LinkedHashMap.Entry
est une classe interne utilisé pour les entrées dans unLinkedHashMap
. Comme vous pouvez le deviner à partir d'une liste doublement chaînée, chacun stocke une référence à la précédente et suivante éléments.LinkedIterator
utilise explicitement l'entrée suivante au cours d'une itération et chacun des 3Set
s itérateurs héritent de cette.Regardant le source, on dirait qu'il fait.
keySet()
,values()
, etentrySet()
tous utiliser la même entrée itérateur interne.Ne pas se confondre avec
LinkedHashMap.keySet()
etLinkedHashMap.entrySet()
de retour Ensemble et donc il ne devrait pas garantir la commande !Set
est une interface avecHashSet
,TreeSet
etc êtres de sa mise en œuvre. LeHashSet
mise en œuvre deSet
interface n'est pas des garanties de la commande. MaisTreeSet
n'. AussiLinkedHashSet
n'.Par conséquent, il dépend de la façon dont
Set
a été mis en œuvre dansLinkedHashMap
de savoir si le retour de l'Ensemble de référence sera la garantie de la commande ou pas.Je suis allé dans le code source de
LinkedHashMap
, il ressemble à ceci:Ainsi LinkedHashMap/HashMap a sa propre mise en œuvre de
Set
c'est à direKeySet
. Donc ne pas confondre avecHashSet
.Aussi, l'ordre est maintenu par la manière dont les éléments sont insérés dans le seau. Regardez les
addEntry(..)
méthode deLinkedHashMap
et de la comparer avec celle deHashMap
qui met en évidence la principale différence entreHashMap
etLinkedHashMap
.Vous pouvez supposer donc. La Javadoc dit "prévisibles itération de l'ordre", et la seule itérateurs disponible dans une Carte sont ceux pour le keySet(), entrySet () et values().
Donc, en l'absence de toute autre qualification, il est clairement destiné à s'appliquer à l'ensemble de ces itérateurs.
Autant que je sache, il n'est pas documenté de sorte que vous ne peut pas "officiellement" supposons donc. Il est peu probable, toutefois, que la mise en œuvre du changement.
Si vous voulez vous assurer de commande, vous pouvez effectuer une itération sur la carte entrées et les insérer dans un ensemble trié avec une fonction de commande de votre choix, si vous choisissez de payer un coût de performance, naturellement.
À la recherche à l'interface elle renvoie une plaine
Set
et pas unSortedSet
. Donc, il n'y a pas de garanties.Avant l'hypothèse d'une garantie implicite par la recherche à la mise en œuvre (toujours une mauvaise idée) s'intéressent aussi à la mise en œuvre dans tous les autres implémentations Java 🙂
Vous pourriez mieux créer par exemple un TreeSet avec le jeu de clés dans le constructeur.
Je ne pense pas qu'on puisse présumer de la commande de keySet() et values().
Je peux facilement écrire une implémentation de LinkedHashMap qui vous renvoie non ordonnée keySet() et values(), aussi longtemps que je m'en tiens à le contrat de ces deux méthodes qui sont définies dans la Carte, et remplacé dans la table de hachage.
LinkedHashMap
classe est de garder 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 respecter la classe de base de la spécification, alors vous êtes en train de faire quelque chose de très mal.