Si quelqu'un m'a laissé décrire le mécanisme de travail de la carte de hachage, je répondrai simplement: "Règles basées sur le hachage". Cette phrase est très simple, mais avant de comprendre cette phrase, nous devons d'abord comprendre ce qui est, n'est-ce pas?
Qu'est-ce qu'un beh
Le hachage est simplement une chaîne unique obtenue après que l'attribut de la variable / objet est appliqué à un certain algorithme, et cette chaîne est utilisée pour déterminer l'unicité de la variable / objet. Une fonction de hachage correcte doit respecter ce critère.
Lorsque la fonction de hachage est appliquée au même objet ou à un objet égal, chaque exécution doit renvoyer la même valeur. En d'autres termes, deux objets égaux devraient avoir le même code de hash.
Remarque: Tous les objets Java héritent d'une méthode HashCode () par défaut de la classe d'objets. Cette méthode renvoie l'adresse de l'objet dans la mémoire comme un entier.
Une introduction à la classe d'entrée
La définition d'une carte est: un objet d'une clé de mappage à la valeur. Très simple, non?
Par conséquent, il doit y avoir un certain mécanisme dans Hashmap pour stocker ces paires de valeurs clés. Make Hashmap a une entrée de classe interne, qui ressemble à ceci.
Entrée de classe statique <k, v> implémente Map.Entry <k, v> {Key final K;
Bien sûr, la classe d'entrée a des attributs pour stocker les valeurs clés. La clé est marquée par la finale. Ensuite, nous essayons de comprendre la signification de ces variables.
Que fait réellement la méthode put ()?
Avant de regarder la mise en œuvre de la méthode de put, il est nécessaire de jeter un coup d'œil au stockage de l'instance d'entrée dans le tableau.
/ ** * Le tableau, redimensionnez asilessy. / *** associe la valeur spécifiée à la clé spécifiée de cette carte. valeur de valeur à association à la clé de spécification * @return la valeur précédente associée à </ tt>, ou * <tt> null </tt> si theer e /tt>.* (a <tt> null </tt> Le retour peut également indiquer que la carte de la carte * Association précédemment <TT> NULL </TT> KEY </TT>.) * / Public v put (k key, value) {if (key == null) return putFornullKey (value); int hash = have (key.hashcode ()); int (entrée <k, v> e = table [i]; e! = null; e = e.next) {objet k; && (k = e.key) == key || key.equals (k)) {v oldvalue = e.value; e.value = valeur; e.rcordaccess (this); , key, tout);
Regardons étape par étape
Tout d'abord, vérifiez si la clé est nul.
Ensuite, la valeur de hachage de cette clé est calculée via la méthode Key HashCode (), qui est utilisée pour calculer la position dans le tableau de l'objet d'entrée. Le concepteur de JDK suppose que certaines personnes peuvent écrire des méthodes de HashCode () très médiocres, et il y aura des valeurs de hachage très grandes ou très petites. Pour résoudre ce problème, ils ont introduit une autre fonction de hachage pour accepter le HashCode () de l'objet et le convertir en capacité du tableau.
Vient ensuite la méthode indexfor (hachage, table, longueur), qui calcule l'emplacement précis du stockage d'objet d'entrée.
Ensuite, la partie principale.
La réponse est liée. Si vous vous en souvenez, la classe d'entrée a une variable suivante, cette variable pointe toujours vers la variable suivante de la chaîne, qui répond pleinement aux caractéristiques de la liste liée.
Par conséquent, lorsqu'une collision se produit, l'objet d'entrée sera stocké sous la forme d'une liste liée. L'objet d'entrée actuel est utilisé comme le nœud suivant de l'objet d'entrée qui a été stocké.
Et si nous enregistrons la clé existante dans une autre valeur? Logiquement, l'ancienne valeur sera remplacée. Après avoir détecté la position de stockage de l'objet d'entrée, HashMap traversera la liste liée à l'entrée dans cette position. Si vous constatez que la méthode égale est égale, le remplacement est effectué.
De cette façon, Hashmap peut assurer le caractère unique de la clé.
Le mécanisme de travail de la méthode GET
Maintenant, nous avons appris le mécanisme de stockage - apparié dans Hashmap. La question suivante est: comment interroger les résultats d'un hashmap.
En fait, la logique est la même que le put.
/ *** Renvoie la valeur à laquelle la touche spécifiée est mappée, * ou {@code null} Si cette carte ne contient aucun mappage pour la clé. * {@code k} à une valeur {@code v} tel que {@code (key == null? k == null: * key.equals (k)}, alors cette méthode renvoie {@code v}; o theerwise * il retourne {@code null}. Utilisé pour * distinguer les deux cas. )); = clé ||
Le code ci-dessus ressemble à la méthode put (), sauf if (e.hash == hash && ((k = e.key) == key || key.equals (k))).
Faites attention