HashMap实现原理:容量、负载因子、hash与定位都搞定了吗?( 二 )

----HashMap实现原理:容量、负载因子、hash与定位都搞定了吗?//---- http://


HashMap是常考点 , 而一般不问List的几个实现类(偏简单) 。 以下基于JDK1.8.0_102分析 。

JDK版本:oracle java 1.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时能带来极大便利) 。

推荐阅读