天天看点

HashMap底层分析_计算hash值

HashMap底层分析_计算hash值

当我们向HashMap容器中put一个元素时,这个元素会被放到一个Node结点对象中,结点对象又会被放入到数组中,那么结点对象会被放入数组的什么位置呢?这是由key的hash值来决定的。

HashMap底层分析_计算hash值

hash值,就是用来确定结点对象,在数组中存储位置的索引。hash值,是通过hash算法,对key对象的hashCode值进行计算得到的。

HashMap底层分析_计算hash值

1. 调用key对象的hashCode()方法,获得key的hashCode值。

2. 根据hashCode值,通过hash算法,计算出hash值。(那么使用什么算法来计算hash值呢? 既要保证 运算速度快,又要保证 计算出来的hash值能均匀分布在[0,数组长度 - 1]区间内)

3. hash算法:

  • 【取余运算】:hash值 = hashCode值 % 数组长度
  •   【位运算】:hash值 = hashCode值 & (数组长度 - 1)

取余运算,这种hash算法可以使hash值均匀分布在[0,数组长度 - 1]区间内,但该算法使用了%取余运算,效率低下。(注意:cpu在做

/

除法运算 或

%

取余运算时,效率是很低的)

位运算,jdk对hash算法进行了改进,使用位运算替代了取模运算。通过位运算实现取余效果,效率高。(注意:该算法的使用前提是,必须约定数组长度为2的幂次方。这就是HashMap的容量必须为2的幂次方的原因)

继续阅读