【95、hashmap 扩容机制 0.75怎么算出来的】

129 阅读1分钟

Java 8 中 HashMap 的扩容机制与 Java 7 不同。在 Java 8 中,HashMap 会在达到负载因子的阈值(默认为 0.75)时扩容,而且它使用了一种不同的机制来计算容量和阈值。

在 Java 8 中,HashMap 使用了树化的桶(tree-based bins)来处理键碰撞(collision)问题。当桶中元素的数量大于等于 8 时,HashMap 会将该桶转换成一棵树,这样可以避免哈希表退化成链表。

HashMap 的容量(capacity)和阈值(threshold)计算方式与 Java 7 略有不同。在 Java 8 中,HashMap 的容量总是 2 的幂次方,这是为了方便通过位运算来计算桶的索引。HashMap 的阈值则是容量与负载因子的乘积,也就是 capacity * loadFactor。

扩容时,HashMap 会将容量翻倍,并更新阈值。例如,当前 HashMap 的容量为 16,负载因子为 0.75,阈值为 12。当 HashMap 中元素的数量达到 12 时,HashMap 会将容量翻倍,容量变为 32,阈值也会更新为 24(32 * 0.75)。

因此,Java 8 中 HashMap 扩容机制的负载因子为 0.75 是通过容量和阈值的乘积计算出来的。