HashMap 1.7版本结构: 是基于数组+链表实现的。当多个键映射到相同的桶(数组的一个位置)时,它们通过链表连接。这种实现方式在一些情况下可能导致性能下降,特别是当链表长度变得很长时。
HashMap 1.8版本结构: 在JDK 8中,HashMap的实现进行了优化,引入了红黑树。当链表长度超过一定阈值(默认为8)时,会将链表转换为红黑树。这样可以在某些情况下提高检索性能,因为红黑树的搜索复杂度是O(logn)。
红黑树的搜索复杂度: 红黑树的搜索复杂度是O(logn),也就相当于数据增加256倍,搜索时间增加8倍。这使得在较大的数据集中,红黑树相对于链表可以更快地进行搜索。但是,红黑树的一些额外开销可能会在小型数据集中产生性能损失。
判断链表转换为红黑树的条件: 在HashMap的1.8版本中,当链表长度超过8且数组容量大于64时,会触发链表转换为红黑树的操作。这是为了在大数据集中提高性能。
在HashMap的实现中,有两个重要的参数影响着性能和空间的平衡,它们分别是负载因子和初始容量。默认情况下,负载因子是0.75,初始容量是16。这意味着当HashMap中的元素个数达到容量的75%时(16x0.75=12),会触发扩容操作,将数组容量扩大为原来的两倍。
链表转换为红黑树的条件是链表长度超过8,而不是8。数组容量大于64才会触发链表转换为红黑树的操作,而不是默认值64。这些值都是可以在创建HashMap时通过构造函数指定的参数进行调整的。
对于默认值的设定,如果你没有在构造HashMap时指定初始容量,负载因子,或者其他参数,那么会使用默认的值。默认的初始容量是16,负载因子是0.75。