HashTable:
int index = (hash & 0x7FFFFFFF) % tab.length;
:
- ()
HashMap:
int i = indexFor(hash, table.length);
:
static int indexFor(int h, int length) {
return h & (length-1);
}
-1
, modulo length-1
, , , - -2. -1 , , 0xFFFFFFFF
, , , 0xFFFFFFFE
.
( HashMap HashTable). (), . hash(), (. ) HashTable:
int hash = hash(key.hashCode());
hash():
/**
258 * Applies a supplemental hash function to a given hashCode, which
259 * defends against poor quality hash functions. This is critical
260 * because HashMap uses power-of-two length hash tables, that
261 * otherwise encounter collisions for hashCodes that do not differ
262 * in lower bits. Note: Null keys always map to hash 0, thus index 0.
263 */
264 static int hash(int h) {
265 // This function ensures that hashCodes that differ only by
266 // constant multiples at each bit position have a bounded
267 // number of collisions (approximately 8 at default load factor).
268 h ^= (h >>> 20) ^ (h >>> 12);
269 return h ^ (h >>> 7) ^ (h >>> 4);
270 }
271