数组+链表+红黑树

1.8链表用的是尾插法,要判断链表元素个数

1. 根据key通过哈希算法与运算符计算数组下标

2. 如果下标位置元素为空,则将key和value封装node对象

3. 数组下标位置不为空

(1) 判断NODE类型,是红黑树还是链表

① 红黑树,增加一个红黑树节点,判断红黑树种是否存在当前key,存在更新value

② 如果是链表,用尾插法插入到链表的最后位置,因为是尾插法,所以需要遍历链表,判断是是否存在当前key,存在更新value,插入后看链表的长度,如果大于等于8转为红黑树(数组的大小大于等于64,因为数组长度较小的时候扩容是减少链表长度的首选)。

③ 插入链表或者红黑树后,判断是否需要扩容。

4. 扩容机制

(1) HashMap的扩容主要是通过增加其底层数组的大小来实现。扩容时,HashMap会创建一个新的数组,其大小通常是原数组的两倍(或根据特定的扩容因子决定)。这种策略有助于减少哈希冲突,提高查找效率。

(2) 在扩容过程中,所有元素都需要根据新的数组大小重新计算哈希值,并映射到新的位置。这一过程称为重新哈希。重新哈希的目的是确保元素在新数组中的分布更加均匀,以减少哈希冲突。为了优化重新哈希的过程,HashMap的数组长度通常选择为2的幂次方。这样做的好处是,在进行哈希计算时,可以通过位运算快速确定元素在新数组中的位置,从而提高性能。