扩容在什么时候呢?为什么扩容因子是0.75?

为了减少哈希冲突发生的概率,当当前HashMap的元素个数达到一个临界值的时候,就会触发扩容,把所有元素rehash之后再放在扩容后的容器中,这是一个相当耗时的操作。

1.png

而这个临界值threshold就是由加载因子和当前容器的容量大小来确定的,假如采用默认的构造方法:

临界值(threshold )= 默认容量(DEFAULT_INITIAL_CAPACITY) * 默认扩容因子(DEFAULT_LOAD_FACTOR)

2.png

那就是大于16x0.75=12时,就会触发扩容操作。

那么为什么选择了0.75作为HashMap的默认加载因子呢?

简单来说,这是对空间成本和时间成本平衡的考虑。

在HashMap中有这样一段注释:

3.png

我们都知道,HashMap的散列构造方式是Hash取余,负载因子决定元素个数达到多少时候扩容。

假如我们设的比较大,元素比较多,空位比较少的时候才扩容,那么发生哈希冲突的概率就增加了,查找的时间成本就增加了。

我们设的比较小的话,元素比较少,空位比较多的时候就扩容了,发生哈希碰撞的概率就降低了,查找时间成本降低,但是就需要更多的空间去存储元素,空间成本就增加了。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题