为什么 HashMap 会重新哈希由键对象提供的哈希码?
2022-09-03 05:09:06
我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(在put和get方法的正文中找到):
int hash = hash(key.hashCode());
其中,该方法具有以下主体:hash()
private static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
这可以通过对提供的哈希码执行位操作来有效地重新计算哈希。我无法理解这样做的必要性,即使API声明如下:
这一点至关重要,因为 HashMap 使用两个长度的幂哈希表,否则会遇到哈希代码的冲突,而哈希代码在较低位上没有差异。
我确实知道键值pars存储在数据结构数组中,并且此数组中项目的索引位置由其哈希确定。我不明白的是,这个函数如何为哈希分布添加任何值。