Ça va être une longue réponse, prenez un verre et lisez la suite…
Le hachage consiste à stocker en mémoire une paire clé-valeur qui peut être lue et écrite plus rapidement. Il stocke les clés dans un tableau et les valeurs dans une LinkedList.
Disons que je veux stocker 4 paires de valeurs clés -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Donc, pour stocker les clés, nous avons besoin d'un tableau de 4 éléments. Maintenant, comment mapper l'une de ces 4 clés à 4 index de tableau (0,1,2,3)?
Ainsi, java trouve le hashCode de clés individuelles et les mappe à un index de tableau particulier. Formules Hashcode est -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Hash et fille !! Je sais à quoi tu penses. Votre fascination pour ce duo sauvage pourrait vous faire manquer une chose importante.
Pourquoi java le multiplie par 31?
C'est parce que 31 est un nombre premier impair sous la forme 2 ^ 5 - 1. Et un nombre impair réduit les risques de collision de hachage
Maintenant, comment ce code de hachage est mappé à un index de tableau?
réponse est Hash Code % (Array length -1)
. “girl”
Est donc mappé à(3173020 % 3) = 1
dans notre cas. qui est le deuxième élément du tableau.
et la valeur "ahhan" est stockée dans une LinkedList associée à l'index de tableau 1.
HashCollision - Si vous essayez de trouver hasHCode
les clés “misused”
et d' “horsemints”
utiliser les formules décrites ci-dessus, vous verrez les deux nous donner la même chose 1069518484
. Whooaa !! leçon apprise -
2 objets égaux doivent avoir le même hashCode mais il n'y a aucune garantie si le hashCode correspond alors les objets sont égaux. Il doit donc stocker les deux valeurs correspondant à «mal utilisé» et «horsemints» au compartiment 1 (1069518484% 3).
Maintenant, la carte de hachage ressemble à -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Maintenant, si un corps essaie de trouver la valeur de la clé “horsemints”
, java trouvera rapidement le hashCode de celui-ci, le modulera et commencera à rechercher sa valeur dans la LinkedList correspondanteindex 1
. Ainsi, nous n'avons pas besoin de rechercher tous les 4 index de tableau, ce qui accélère l'accès aux données.
Mais attendez une seconde. il y a 3 valeurs dans ce LinkedList correspondant Array index 1, comment il découvre laquelle était la valeur pour les «horsemints» clés?
En fait, j'ai menti, quand j'ai dit que HashMap stocke juste des valeurs dans LinkedList.
Il stocke les deux paires de valeurs clés comme entrée de carte. Donc, en réalité, Map ressemble à ceci.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Maintenant, vous pouvez voir En parcourant la LinkedList correspondant à ArrayIndex1, il compare en fait la clé de chaque entrée à celle de cette LinkedList à «horsemints» et quand il en trouve une, il n'en retourne que la valeur.
J'espère que vous vous êtes amusé en le lisant :)