面试题答案
一键面试- 获取键对象的哈希码:
- 首先调用键对象的
hashCode()
方法,这个方法是Object
类的方法,每个Java对象都有。不同的对象如果内容不同,理想情况下应该返回不同的哈希码。例如:
String key = "example"; int hashCode = key.hashCode();
- 首先调用键对象的
- 对哈希码进行扰动处理(在Java 8及以后):
- 为了减少哈希冲突,HashMap对获取到的哈希码进行扰动处理。在Java 8中,
HashMap
的hash
方法实现如下:
static final int hash(Object key) { int h; return (key == null)? 0 : (h = key.hashCode()) ^ (h >>> 16); }
- 这里通过
(h = key.hashCode()) ^ (h >>> 16)
,将哈希码的高位和低位进行异或操作,使得哈希分布更均匀,降低哈希冲突的概率。
- 为了减少哈希冲突,HashMap对获取到的哈希码进行扰动处理。在Java 8中,
- 计算哈希桶位置:
- 经过扰动处理后的哈希值,会与
HashMap
的容量(capacity
)进行取模运算,得到该键值对应该存储的哈希桶位置。在Java中,为了提高效率,实际使用的是按位与操作(&
)。因为HashMap
的容量总是2的幂次方,n & (length - 1)
等价于n % length
,且按位与操作效率更高。例如:
int hash = hash(key); int bucketIndex = hash & (table.length - 1);
- 这样就确定了键对象在
HashMap
中对应的哈希桶位置。
- 经过扰动处理后的哈希值,会与