Java HashMap 的扩容因子为什么是 0.75
所谓的加载因子,也叫扩容因子或者负载因子,它是用来进行扩容判断的。
假设加载因子是 0.5,HashMap
初始化容量是 16,当HashMap
中有16 * 0.5=8
个元素时,HashMap
就会进行扩容操作。
而HashMap
中加载因子为 0.75,是考虑到了性能和容量的平衡。
由加载因子的定义,可以知道它的取值范围是(0, 1]。
如果加载因子过小,那么扩容门槛低,扩容频繁,这虽然能使元素存储得更稀疏,有效避免了哈希冲突发生,同时操作性能较高,但是会占用更多的空间。
如果加载因子过大,那么扩容门槛高,扩容不频繁,虽然占用的空间降低了,但是这会导致元素存储密集,发生哈希冲突的概率大大提高,从而导致存储元素的数据结构更加复杂(用于解决哈希冲突),最终导致操作性能降低。
还有一个因素是为了提升扩容效率。因为
HashMap
的容量(size
属性,构造函数中的initialCapacity
变量)有一个要求:它一定是 2 的幂。所以加载因子选择了 0.75 就可以保证它与容量的乘积为整数。
简单来说就是结合了存储和时间的考虑,每次扩容都会重新计算 Hash 值的。
评论