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
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é.
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.
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.
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.
hashmap a un ordre non défini des éléments
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.
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.