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 le 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
Vous devez vous connecter pour publier un commentaire.
java.util.HashMap
est pas ordonné; vous ne pouvez pas et ne présumez de rien au-delà.java.util.LinkedHashMap
utilise insertion d'ordre.java.util.TreeMap
, unSortedMap
, utilise soit naturelle ou de la coutume de la commande de clés.Tout d'abord:
HashMap
spécifiquement n'est 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épendent en aucune 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 laHashMap
. (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 la
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 du nombre de compartiments ainsi.
HashMap
n'a pas de tri à tous. Pour une carte qui trie par des valeurs de clé que vous devriez utiliserTreeMap
à la place.De la Javadoc
TreeMap
:À partir de la documentation de
HashMap
:Un
Map
n'est pas ordonnée, structure de données - vous ne devriez pas compter sur des entrées dans unHashMap
d'être dans un certain ordre. CertainsMap
les implémentations commeLinkedHashMap
etTreeMap
faire de garantir un certain ordre, maisHashMap
ne pas.Si vous voulez vraiment savoir ce qui se passe en interne, recherche dans le code source de
HashMap
- vous pouvez le trouver dans src.zip 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 laHashMap
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 dans unHashMap
- la mise en œuvre pourrait changer dans une prochaine version de Java et de votre programme, alors ne marcherait pas non plus.hashmap a pas défini l'ordre des éléments
Il n'existe pas de commande dans une table de hachage. Les touches sont placées dans une fente, basé sur le code de hachage, mais même cela n'est pas triviale ordre par hash-code.
HashMap stocke les valeurs en utilisant le hachage unique,-la valeur générée à l'aide d'une partie de la clé. Ce mot-valeur correspond à l'adresse où elle est stockée. C'est ce qui garantit un accès en O(1).
LinkedHashmap d'autre part préserve l'ordre dans lequel vous avez ajouté à la carte.