Le calcul du hachage consiste à calculer quel élément doit être placé dans le tableau. Pour être précis, il est mis dans quelle liste de liens. Selon les règles de Java, si vous souhaitez mettre un objet dans un hashmap, la classe de votre objet doit fournir une méthode HashCode et renvoyer une valeur entière. Par exemple, la classe String a les méthodes suivantes:
public int hashcode () {int h = hash; int len = count; if (h == 0 && len> 0) {int off = offset; char Val [] = valeur; pour (int i = 0; i <len; i ++) {h = 31 * h + val [off ++]; } hash = h; } return h; } Faites attention à la boucle ci-dessus, n'est-ce pas un peu gâché? Permettez-moi de vous donner un exemple afin qu'il soit facile de comprendre ce qu'il fait. Par exemple, il existe une chaîne "ABCDE" qui utilise une méthode de calcul à 31 chiffres pour calculer la somme de cette chaîne. Vous rédigerez la formule de calcul suivante:
A * 31 ^ 4 + B * 31 ^ 3 + C * 31 ^ 2 + D * 31 ^ 1 + E * 31 ^ 0. Notez que A, B, C, D ou E se réfèrent ici à leurs valeurs ASCII. Des boucles très intéressantes, qui peuvent être utilisées pour calculer le nigit à n. Cette boucle peut être extraite séparément comme un bon outil pour calculer la partition:
public static void main (String [] args) {int [] a = {1,0}; System.out.println (calculer (2, a)); } private static int calcul (int radix, int [] a) {int sum = 0; for (int i = 0; i <a.length; ++ i) {sum = sum * radix + a [i]; } RETOUR SUM; } La méthode statique Caculate accepte Radix comme la cardinalité et le tableau a simule le nombre de calcul à calculer, faites simplement attention à l'ordre de surface cohérent. Par exemple, la chaîne binaire 01 doit être organisée dans le tableau selon {0,1}. La sortie ci-dessus est 1, qui répond à la valeur réelle de 01.
Alors pourquoi utiliser 31 comme base? Tout d'abord, vous devez comprendre pourquoi HashCode est nécessaire. Chaque objet calcule HashCode en fonction de la valeur. Bien que cette taille de code ne nécessite pas d'unicité (car cela sera généralement très lent), il doit être autant que possible et non répété que possible, donc la cardinalité doit être aussi grande que possible. De plus, 31 * N peut être optimisé par le compilateur pour se déplacer à gauche de 5 bits, puis réduire de 1, ce qui a des performances plus élevées. En fait, il est toujours controversé de choisir 31, veuillez y consulter ici.
Je pense que cette chose conduira toujours à plus de répétitions et devrait utiliser des nombres plus importants. Ainsi, il pourrait peut-être y avoir des changements dans la mise en œuvre de Java à l'avenir. L'article suivant présente deux conclusions:
1. Utilisez des nombres premiers pour la cardinalité
Les caractéristiques des nombres premiers (seulement 1 et elle-même sont des facteurs) peuvent rendre le résultat obtenu en le multipliant avec d'autres nombres plus faciles à produire l'unicité que les autres méthodes, c'est-à-dire que la probabilité de conflit entre les valeurs de code de hachage est la plus petite.
2. Le choix 31 est un choix après avoir observé les résultats de la distribution. La raison n'est pas claire, mais elle est en effet bénéfique.
De plus, la première valeur calculée sera mise en cache en interne, car il s'agit d'une classe finale (immuable), c'est-à-dire que le contenu de l'objet String ne changera pas. Cela peut améliorer les performances lors de la mise en place de hashmap plusieurs fois, mais cela semble être peu utile.
Résumer
Ce qui précède est tout sur les raisons pour lesquelles 31 coefficients sont utilisés lors de la définition de HashCode. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
" Introduction détaillée pour réécrire des méthodes HashCode () et Equals () "
" Explication détaillée des différences et connexions essentielles entre HashCode () et Equals () "
" Analyse du code source Java de l'utilisation de hashmap "
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!