一、原理?
在jdk1.7及之前,hashmap是通过数组加链表的形式实现的,而在jdk1.8时hashmap就通过数组加链表或红黑树的方式实现。
键值对添加流程,当需要存储新的键值对(key-value)时,hashmap会根据key的hash值来计算其在数组中的位置,如果有了其他的键值对,则通过链表或红黑树解决冲突,将其添加到链表或红黑树的末尾。

二、链表升级为红黑树的规则
为了查询速度提升将链表升级
1、链表的长度大于阈值(默认为8)
2、并且此时数组的长度大于64
升级流程:
1.创建一个红黑树,将链表中的值全部添加到红黑树中
2.将原来链表的引用指向新创建的红黑树
二、红黑树退化为链表
当进行了删除操作,为了节省内存空间,将红黑树退化为链表
条件:红黑树的节点小于等于6
退化流程:
1.从红黑树根节点开始中序遍历将所有的节点加入到新的链表中
2.再将原来红黑树的引用指向新创建的链表。
总结
HashMap 在 JDK 1.7 时,是通过数组 + 链表实现的,而在 JDK 1.8 时,HashMap 是通过数组 + 链表或红黑树实现的。在 JDK 1.8 之后,如果链表的数量大于阈值(默认为 8),并且数组长度大于 64 时,为了查询效率会将链表升级为红黑树,但当红黑树的节点小于等于 6 时,为了节省内存空间会将红黑树退化为链表。
本文介绍了HashMap在Java1.8版本中的改进,从基于数组和链表的结构升级到使用链表或红黑树处理冲突,以提高查询效率并管理内存空间。
4770





