HashMap

JDK 7 & JDK 8

JDK 7 中,HashMap 由“数组 + 链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。

在 JDK 8 中,HashMap 由“数组 + 链表 / 红黑树”组成。链表过长,会严重影响 HashMap 的性能,而红黑树搜索的时间复杂度是 O(logn),而链表是 O(n)。因此,JDK 8 对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:

  • 当链表超过 8 且数组长度超过 64 时会转红黑树。
  • 将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会优先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
  • 当红黑树中的节点数量降到 6 个或以下时,红黑树会被转换回链表。

为什么链表转为红黑树的阈值是 8?

在 JDK 8 中,HashMap 将链表转换为红黑树的阈值是 8,是一个经验性的选择,旨在在性能和内存占用之间达到平衡。这个阈值的选择是根据一系列实验和性能测试得出的,并且它取决于多种因素,包括哈希冲突的发生频率、链表长度的影响、红黑树的性能等。

以下是一些考虑因素:

  1. 哈希冲突频率: 阈值的选择会受到哈希冲突的频率影响。如果哈希冲突很少发生,那么链表的长度通常不会很长,因此没有必要将其转换为红黑树。如果哈希冲突频繁,链表长度可能会快速增长,因此需要更早地将链表转换为红黑树来维护性能。

  2. 性能考虑

你可能感兴趣的:(java)