68 votes

Ordre des valeurs extraites d'un HashMap

J'essaie de comprendre l'ordre dans lequel les valeurs dans un HashMap sont / peuvent être récupérés. Voici l'extrait de code pour le même.

Sortie:

7 pomme Citron Orange Banane litchi Mangue Papaye

Les valeurs sont imprimées dans l'ordre dans lequel elles ont été insérées. Est-ce vrai en général? Je m'attendais à ce que les valeurs soient imprimées dans l'ordre aléatoire.

Merci.

ps: en utilisant java 6

94voto

notnoop Points 30218

À partir de la Javadoc: HashMap "de la classe ne donne aucune garantie quant à l'ordre de la carte; en particulier, il ne garantit pas que l'ordre demeure constante au cours du temps."

Si vous avez besoin d'conforme à votre commande, vous pouvez utiliser LinkedHashMap (pour l'insertion/accès à la commande), ou TreeMap (pour comparaison l'ordre). Veuillez noter que ces maintenir l'ordre des clés, pas les valeurs.

83voto

Stephen C Points 255558

Les valeurs sont imprimées dans l'ordre dans lequel ils ont été insérés. Est-ce vrai en général? Je m'attendais à les valeurs à être imprimé dans un ordre aléatoire.

L' HashMap API ne permet pas de définir l'ordre d'itération.

Cependant, si vous regardez à la mise en œuvre de la table de hachage, vous pouvez en déduire qu'il existe un complexe transitoire de la relation entre l'itération de commande, les touches de valeurs de hachage, l'ordre dans lequel les clés ont été insérées et la taille de la table de hachage. Cette relation devient brouillé si la table de hachage redimensionne.

Dans votre cas, les valeurs de hachage dont les clés sont les valeurs clés eux-mêmes, et que vous avez inséré les entrées dans l'ordre des clés. Donc, il se trouve que l'itération de l'ordre correspond à l'ordre d'insertion. Mais si vous gardez l'insertion de plus de clés, vous verrez que l'ordre s'enroule autour, puis devient progressivement de plus en plus brouillés.

En bref, ce que vous voyez est un artefact de la table de hachage de la mise en œuvre, et non pas quelque chose que vous pouvez (ou devez) raisonnablement faire usage de.

11voto

Rog Points 1202

Un LinkedHashMap est ce que vous recherchez. De la doco, il diffère de HashMap en ce qu'il maintient une liste doublement liée en cours d'exécution à travers toutes ses entrées

7voto

MadMurf Points 1529

Essayez LinkedHashMap si l'ordre est important... voir de JavaDoc

public class LinkedHashMap s'étend HashMap

Table de hachage et de la liste chaînée la mise en œuvre de l'interface de la Carte, prévisible de l'itération de l'ordre. Cette la mise en œuvre diffère de HashMap dans qu'il maintient une liste à double liaison cours d'exécution à travers toutes ses entrées. Cette liste liée définit l'itération la commande, qui est normalement de l'ordre dans les clés qui ont été insérés dans le carte (insertion d'ordre). Notez que ordre d'insertion n'est pas affecté si un la clé est de ré-inséré dans la carte. (Un la clé k est réinséré dans une carte m si m.put(k, v) est appelée lorsque l' m.containsKey(k) serait de retour vrai immédiatement avant l'invocation.)

1voto

Jim Ferrans Points 13673

Une collection de est java.util.simultanées du ConcurrentSkipListMap. Un skiplist permet de traverser les entrées dans l'ordre des clés et aussi regarder dans un ordre aléatoire (mais pas aussi rapide qu'une table de hachage).

Il y a une belle skiplist applet de démonstration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X