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 值的。

有点想到,在服务器的硬盘空间达到什么程度的时候我们需要扩容硬盘?

貌似通常的说法是针对 Linux 服务器,如果磁盘空间达到百分之 70% 左右的时候应该可以考虑扩容或者更换服务器了。

貌似针对存储来说,不管是内存还是物理存储,70% 这个是一个金科玉律了。