web-dev-qa-db-fra.com

Comment Java commande-t-il les éléments dans un HashMap ou un HashTable?

Je me demandais comment Java ordonnait les éléments dans la Map (HashMap ou Hashtable) lorsqu'ils étaient ajoutés. Les clés sont-elles classées par hashcode, par référence de mémoire ou par priorité d’attribution ...?

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

59
Eyad Salah

Java.util.HashMap n'est pas en ordre; vous ne pouvez et ne devez rien assumer au-delà de cela.

Cette classe ne donne aucune garantie quant à l'ordre de la carte; en particulier, cela ne garantit pas que l'ordre restera constant dans le temps. 

Java.util.LinkedHashMap utilise l'ordre d'insertion.

Cette implémentation diffère de HashMap en ce qu'elle maintient une liste doublement chaînée traversant toutes ses entrées. Cette liste liée définit l'ordre des itérations, qui correspond normalement à l'ordre dans lequel les clés ont été insérées dans la carte (ordre d'insertion). 

Java.util.TreeMap , a SortedMap utilise un ordre naturel ou personnalisé des clés.

La carte est triée en fonction de l'ordre naturel de ses clés ou d'une variable Comparator fournie lors de la création de la carte, en fonction du constructeur utilisé. 

118

Tout d’abord: HashMap spécifiquement n’est pas fournit un ordre stable et/ou défini. Donc, tout ce que vous observez est simplement un détail d’implémentation et vous ne devez pas en dépendent de quelque manière que ce soit.

Comme il est parfois utile de connaître la raison de cet ordre apparemment aléatoire, voici l’idée de base:

Un HashMap possède un nombre de compartiments (implémentés sous forme de tableau) dans lesquels stocker des entrées.

Lorsqu'un élément est ajouté à la carte, il est affecté à des compartiments en fonction d'une valeur dérivée de hashCode et de la taille de compartiment de HashMap. (Notez qu'il est possible que le compartiment soit déjà occupé, ce qui s'appelle une collision. Il est géré correctement et correctement, mais j'ignorerai ce traitement pour la description car il ne modifie pas le concept).

L'ordre perçu des entrées (tel que retourné par une itération sur le Map) dépend de l'ordre des entrées dans ces compartiments.

Chaque fois que la taille est réorganisée (parce que la carte a dépassé son seuil de saturation), le nombre de compartiments change, ce qui signifie que la position de chaque élément peut changer, car la position du compartiment dépend également du nombre de compartiments.

17
Joachim Sauer

HashMap ne trie pas du tout. Pour une carte triant par valeurs de clé, utilisez plutôt TreeMap.

Depuis les JavaDocs pour TreeMap:

Implémentation basée sur un arbre rouge-noir de l'interface SortedMap. Cette classe garantit que la carte sera en ordre croissant des touches, trié selon à l'ordre naturel pour la clé classe (voir Comparable), ou par le comparateur fourni au moment de la création, en fonction de quel constructeur est utilisé.

De la documentation de HashMap:

Cette classe ne fait aucune garantie quant à l'ordre de la carte; en particulier, cela ne garantit pas que la commande restera constant dans le temps.

5
Behrang

Une Map n'est pas une structure de données ordonnée - vous ne devez pas vous fier aux entrées dans une HashMap se trouvant dans un certain ordre. Certaines implémentations Map telles que LinkedHashMap et TreeMap garantissent un certain ordre, mais HashMap ne le fait pas.

Si vous voulez vraiment savoir ce qui se passe en interne, cherchez le code source HashMap - vous le trouverez dans src.Zip , qui devrait se trouver dans votre répertoire d’installation du JDK.

Une HashMap a un certain nombre de "compartiments" dans lesquels elle stocke ses entrées. Le compartiment dans lequel une entrée est stockée est déterminé par le code de hachage de la clé de l'entrée. L'ordre dans lequel vous voyez les entrées dans la HashMap dépend des codes de hachage des clés. Mais n'écrivez pas de programmes qui reposent sur des entrées se trouvant dans un certain ordre dans un HashMap - l'implémentation pourrait changer dans une future version de Java et votre programme ne fonctionnerait plus.

1
Jesper

hashmap a un ordre non défini des éléments

1
Robar

Il n'y a pas d'ordre défini dans une table de hachage. Les clés sont placées dans un emplacement, basé sur le code de hachage, mais même cela n'est pas un code trivial d'ordre par hachage.

0
Marcelo Cantos

HashMap stocke les valeurs à l'aide de la valeur de hachage unique générée à l'aide d'une partie de la clé. Cette valeur de hachage correspond à l'adresse où elle sera stockée. C'est ainsi que cela assure un accès O (1).

En revanche, LinkedHashmap préserve l'ordre dans lequel vous avez ajouté à la carte.

0
Vaishak Suresh