java吧 关注:1,282,673贴子:12,803,462
  • 1回复贴,共1

你需要掌握的HashMap实现原理

只看楼主收藏回复

(文末有白嫖惊喜!懂?)
HashMap是常考点,而一般不问List的几个实现类(偏简单)。以下基于JDK1.8.0_102分析。
一、内部存储
HashMap的内部存储是一个数组(bucket),数组的元素Node实现了是Map.Entry接口(hash, key, value, next),next非空时指向定位相同的另一个Entry,如图:

二、容量(capacity)和负载因子(loadFactor)
简单的说,capacity就是bucket的大小,loadFactor就是bucket填满程度的最大比例。当bucket中的entries的数目(而不是已占用的位置数)大于capacity*loadFactor时就需要扩容,调整bucket的大小为当前的2倍。同时,初始化容量的大小也是2的次幂(大于等于设定容量的最小次幂),则bucket的大小在扩容前后都将是2的次幂(非常重要,resize时能带来极大便利)。

三、hash与定位
作为API的设计者,不能假定用户实现了良好的hashCode方法,所以通常会对hashCode再计算一次hash:

四、hashCode方法

五、hash方法的实现和定位
前面已经说过,在get和put计算下标时,先对hashCode进行hash操作,然后再通过hash值进一步计算下标,如下图所示:


1楼2020-06-29 10:08回复
    看到最后闪了老子的腰


    来自Android客户端5楼2020-06-29 18:41
    回复