2009-07-27 4 views
56

J'utilise un linkedHashMap pour garantir la commande quand quelqu'un essaie d'y accéder. Cependant, quand vient le temps de parcourir, est-ce que l'utilisation de entrySet() pour retourner des paires clé/valeur garantit également l'ordre? Aucun changement ne sera effectué pendant l'itération.Est-ce que entrySet() dans LinkedHashMap garantit également la commande?

ÉDIT: Également, y'a-t-il des effets défavorables d'itération à travers la carte en itérant à travers ses touches et en appelant get?

+0

J'étais sur le point de poser la même question, mais pourquoi demander si quelqu'un d'autre a déjà demandé et reçu une bonne réponse? +1 pour une bonne question – uTubeFan

+0

Dans LinkedHashMap, vous pouvez utiliser insert-order et access-order. La commande est toujours maintenue. S'il vous plaît couvrir mon [vie interne de LinkedHashMap] (http://volodial.blogspot.com/2013/07/internal-life-of-linkedhashmap-in-java.html) tutoriel –

+0

duplication possible de [Est-ce que la commande est garantie pour le retour des clés et valeurs d'un objet LinkedHashMap?] (http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a- linkedhashmap-o) – Roland

Répondre

43

Selon le Javadocs, oui . Cette implémentation diffère de HashMap en ce qu'elle maintient une liste à double liaison parcourant toutes ses entrées. Cette liste liée définit l'ordre d'itération, qui est normalement l'ordre dans lequel les clés ont été insérées dans la carte (insertion-order). En ce qui concerne l'édition, non, cela devrait fonctionner correctement. Mais l'ensemble d'entrées est un peu plus rapide car il évite le temps de recherche de toutes les clés de la carte pendant l'itération.

+11

mais entrySet renvoie un ensemble qui n'est pas ordonné lui-même? –

+3

Oui, techniquement, entrySet lui-même n'a aucun moyen d'accéder à une position, mais entrySet.iterator() le fait. L'itérateur nous permet d'avoir une liste ordonnée. – Jpatrick

+2

Je voudrais savoir que cette réponse est correcte, mais comme l'a souligné Jonathan, 'entrySet()' renvoie un Set. Jpatrick dit que l'itérateur de l'ensemble nous permet d'avoir une liste ordonnée, mais http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator() dit "Les éléments sont retournés dans aucun ordre particulier (sauf si cet ensemble est une instance d'une classe qui fournit une garantie). " Et aucun des docs référencés ici ne dit que entrySet() retourne un Set qui est une instance d'une classe qui garantit l'ordre. Est-ce que je manque quelque chose? – LarsH

1

Cette liste chaînée définit l'ordre d'itération, qui est normalement l'ordre dans lequel les clés ont été insérées dans la carte (ordre d'insertion). Notez que l'ordre d'insertion n'est pas affecté si une clé est réinsérée dans la carte. (A clé k est réinséré dans une carte m si m.put (k, v) est invoquée lorsque m.containsKey (k) retournerait vrai immédiatement avant l'invocation.)

1

Si vous êtes sûr qu'aucun changement ne sera effectué au cours de l'itération, la bonne commande avec entrySet() est garantie, comme indiqué dans le API.

+1

Les documents de l'API auxquels vous avez lié pour' entrySet() 'ne disent rien sur la garantie d'une bonne commande. La seule déclaration connexe sur cette page est "This class [i.e.HashMap] ne donne aucune garantie quant à l'ordre de la carte; en particulier, il ne garantit pas que la commande restera constante au fil du temps. »À quoi faisiez-vous référence avec ce lien? – LarsH

Questions connexes