Un hashmap fonctionne comme suit (c'est un peu simplifié, mais cela illustre le mécanisme de base) :
Il dispose d'un certain nombre de "godets" dans lesquels il stocke les paires clé-valeur. Chaque godet a un numéro unique - c'est ce qui identifie le godet. Lorsque vous placez une paire clé-valeur dans la carte, le hashmap examine le code de hachage de la clé et stocke la paire dans le godet dont l'identifiant est le code de hachage de la clé. Par exemple : Le code de hachage de la clé est 235 -> la paire est stockée dans le godet numéro 235. (Notez qu'un godet peut stocker plus d'une paire clé-valeur).
Lorsque vous recherchez une valeur dans le hashmap, en lui donnant une clé, il regardera d'abord le code de hachage de la clé que vous avez donnée. Le hashmap cherchera ensuite dans le seau correspondant, puis il comparera la clé que vous avez donnée avec les clés de toutes les paires dans le seau, en les comparant à equals()
.
Vous pouvez maintenant voir comment cette méthode est très efficace pour rechercher des paires clé-valeur dans une carte : grâce au code de hachage de la clé, la carte de hachage sait immédiatement dans quel seau chercher, de sorte qu'elle ne doit tester que ce qui se trouve dans ce seau.
En observant le mécanisme ci-dessus, vous pouvez également voir quelles sont les exigences nécessaires sur le site de l hashCode()
et equals()
méthodes de clés :
-
Si deux clés sont identiques ( equals()
renvoie à true
quand on les compare), leur hashCode()
doit retourner le même nombre. Si les clés ne respectent pas cette règle, des clés égales pourraient être stockées dans des compartiments différents, et le hashmap ne serait pas en mesure de trouver des paires clé-valeur (car il chercherait dans le même compartiment).
-
Si deux clés sont différentes, il importe peu que leurs codes de hachage soient identiques ou non. Elles seront stockées dans le même bucket si leurs codes de hachage sont les mêmes, et dans ce cas, le hashmap utilise equals()
pour les différencier.
34 votes
Pour mémoire : #Les numéros 1 et 2 sont corrects, le numéro 3 est faux : deux objets qui ne sont pas égaux. puede ont le même code de hachage.
7 votes
1 et #3 sont contradictoires même
0 votes
En effet, si le point 2 n'est pas suivi, alors l'implémentation de equals() (ou sans doute de hashCode()) est incorrecte.