1. hashMap如何计算key的hash值?为什么?
hash = (h=key.hashCode()) ^ (h >>> 16)
因为在计算下标值的时候,采用的公式如下,其中n是table的长度。
index = (n-1) & hash
计算index的时候,都是取hash值的低n位,高位无法参与运算。为了降低hash碰撞的概率,取高16位和低16位异或的结果作为新的低16位,这样低16位中融合了高16位的特征,这又称为扰动函数。
2. 为什么hashMap的table长度都是2的n次幂?
- 和下标值的计算公式有关。方便进行&运算,提高效率,&比取模运算的效率高
index = (n-1) & hash
table的长度是2的n次幂,才可以使用上面的公式计算下标值。因为n-1的二进制的低n位是“低位掩码”(都是1),使得hash的低n位都可以参与到index的计算中来。
举例说明,假如让n=14,那么n-1(13)的二进制表示就是1101,index的末尾第二位永远不会等于1。也就是说末尾第二位是1的index,永远不会被命中。
- 和扩容过程中Node的迁移有关。令table长度是2的n次幂,则只需要观察