hashcode()
Si vous mappez d'un ensemble plus grand à un ensemble plus petit, vous aurez toujours des collisions. Si vous regardez le code source de HashMap, vous trouverez la méthode suivante pour mapper int à la longueur du seau.
static int indexFor(int h, int length) {
return h & (length-1);
}
Le code de hachage est prétraitée pour produire une distribution uniforme en utilisant:
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20)^(h >>> 12);
return h^(h >>> 7)^(h >>> 4);
}
applique une fonction de hachage supplémentaire à un hashCode donné, qui protège contre des fonctions de hachage de mauvaise qualité. Ceci est critique car HashMap utilise des tables de hachage power-of-two length, qui sinon rencontrent des collisions pour hashCodes qui ne diffèrent pas dans les bits inférieurs. Note: Les clés nulles correspondent toujours au hash 0, donc index 0.
HashMap source
Perfect Answer! L'index du compartiment est décidé par hashCode()% capacity – supernova