HashMap中的初始容量和加载因子

通过查看HashMap底层源码的初始默认容量16,加载因子0.75.

在这里插入图片描述
在这里插入图片描述
HashMap有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动扩容之前可以达到多满的一种度量。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行扩容、rehash操作(即重建内部数据结构),扩容后的哈希表将具有两倍的原容量。

为了减少冲突的概率,当hashMap的数组长度到了一个临界值就会触发扩容,把所有元素rehash再放到扩容后的容器中,所以说rehash是一个非常耗时的操作。

而这个临界值是由加载因子和当前容器的容量大小来确定:DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR ,即默认情况下是16x0.75=12时,就会触发扩容操作。

通过上述了解,那么就会在面试中经常被提出的问题:为什么加载因子初始化是0.75呢?
  • 加载因子过高,例如为1,这样会减少空间开销,提高空间利用率,但同时会增加查询时间的成本
  • 加载因子过低,例如为0.5,虽然可以减少查询时间,但是空间利用率很低,同时提高了rehash操作的次数

在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash操作次数,所以,一般在使用HashMap时建议根据预估值设置初始容量,减少扩容操作。

因此,选择0.75作为默认的加载因子,完全是时间和空间成本上寻求折中的选择.
在这里插入图片描述
简单翻译一下就是在理想情况下,使用随机哈希码,节点出现的频率在hash桶中遵循泊松分布,同时给出了桶中元素个数和概率的对照表。

从上面的表中可以看到当桶中元素到达8个的时候,概率已经变得非常小,也就是说用0.75作为加载因子,每个碰撞位置的链表长度超过8个是几乎不可能的。

总结一下:提高空间利用率和检查查询成本的折中,主要是泊松分布,选择0.75的话,碰撞最小

猜你喜欢

转载自blog.csdn.net/weixin_44723496/article/details/112387738