60 votes

Comment Java ordre des éléments dans une table de hachage ou une table de hachage?

Je me demandais comment Java commandes des éléments dans l' Map (HashMap ou Hashtable) lorsqu'ils sont ajoutés. Sont les clés commandé par le hashcode, la mémoire de référence ou par affectation de priorité...?

C'est parce que j'ai remarqué que même les paires dans la Map ne sont pas toujours dans le même ordre

122voto

polygenelubricants Points 136838

java.util.HashMap n'est pas ordonné; vous ne pouvez pas et ne présumez de rien au-delà.

Cette 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.

java.util.LinkedHashMap utilise insertion d'ordre.

Cette mise en œuvre diffère HashMap en ce 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 de la commande, qui est normalement de l'ordre dans lequel les clés ont été insérées dans la carte (d'insertion).

java.util.TreeMap, SortedMap, utilise soit naturelle ou de la coutume de la commande de clés.

La carte est triée selon l'ordre naturel de ses clés, ou par un Comparator fournie au moment de la création de la carte, en fonction du constructeur est utilisé.

18voto

Joachim Sauer Points 133411

Tout d'abord: HashMap précisément ne pas fournir une base stable et/ou défini de la commande. Donc, tout ce que vous observez, c'est tout simplement un détail d'implémentation, et vous ne doit pas dépendre d'une quelconque façon.

Depuis qu'il est parfois utile de connaître la raison de l'apparence aléatoire de la commande, voici l'idée de base:

Un HashMap a nombre de compartiments (implémentée par un tableau) dans lequel stocker les entrées.

Lorsqu'un élément est ajouté à la carte, il est affecté à un des seaux basée sur une valeur dérivée de son hashCode et le seau de la taille de l' HashMap. (Notez qu'il est possible que le seau est déjà occupée, que l'on appelle une collision. C'est géré correctement et correctement, mais je vais ignorer que la manipulation de la description, car il ne change pas le concept).

La perception de l'ordre des entrées (tel que retourné par itération sur l' Map) dépend de l'ordre des entrées dans ces seaux.

Chaque fois que la taille est rabâchage (parce que la carte a dépassé sa plénitude seuil), alors le nombre de seaux de changements, ce qui signifie que la position de chaque élément peut changer, puisque le seau position est dérivée à partir du nombre de seaux.

5voto

Behrang Points 13471

HashMap n'a pas de tri à tous. Pour une carte qui trie par des valeurs de clé que vous devez utiliser TreeMap à la place.

À partir de la Javadoc TreeMap:

Rouge-Noir arbre en fonction de la mise en œuvre de l'interface SortedMap. Cette classe garantit que la carte soit dans ordre croissant ordre des clés, classés en fonction à l'ordre naturel de la clé catégorie (voir Comparables), ou par la comparateur fournies au moment de la création, selon le constructeur est utilisé.

À partir de la documentation de l' HashMap:

Cette classe ne donne aucune garantie quant à la commande de la carte; en particulier, il ne garantit pas que l'ordre restent constants au cours du temps.

1voto

Jesper Points 65733

Un Map n'est pas ordonnée, structure de données - vous ne devriez pas compter sur des entrées dans un HashMap d'être dans un certain ordre. Quelques - Map implémentations telles que l' LinkedHashMap et TreeMap garantissons un certain ordre, mais HashMap ne le sont pas.

Si vous voulez vraiment savoir ce qui se passe en interne, la recherche de la source du code de l' HashMap - vous pouvez le trouver dans src.zip ce qui devrait être dans votre répertoire d'installation du JDK.

Un HashMap a un certain nombre de "seaux", dans lequel il stocke ses entrées. Quel contenant une entrée est stockée dans est déterminé par le code de hachage de la clé de l'entrée. L'ordre dans lequel vous voir les entrées de l' HashMap dépend de la valeur de hachage codes des touches. Mais ne pas écrire des programmes qui s'appuient sur les participations dans un certain ordre en HashMap - la mise en œuvre pourrait changer dans une prochaine version de Java et de votre programme, alors ne marcherait pas non plus.

1voto

Robar Points 583

hashmap a pas défini l'ordre des éléments

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