HashMap内部数据结构使用数组+链表+红黑树进行存储
-
数组类型为Node[],每个Node都保存了某个KV键值对元素的key、value、hash、next等值。
-
链表,它由一系列节点组成,每个节点包含两部分:数据和指向下一个节点的指针。
-
当链表的长度超过8并且数组长度大于64时,为了避免查找搜索性能下降,该链表会转换成一个红黑树。
一、存储数据的过程put()
1、HashMap在存储数据时,会将key和value封装在一个Node[]
2、调用key的hashcode()方法获取key的哈希码
3、通过转换算法将其转换为数组的下标
4、当数组下标没有值,就直接将此Node[]放在这个下标
5、当数组下标下有值,就会将key和链表上的每一个值进行比较
6、如果equal()都返回false则将其加入链表最后
7、如果equal()和链表某个节点返回true则将其节点进行覆盖
二、取数据过程get()
1、根据key的值算出hashcode
2、通过转换算法将其转换为数组的下标
3、如果当前下标为null则直接返回空
4、如果当前下标是链表,会使用equal()方法和链表上的节点进行比较
5、如果都返回false则返回空
6、如果有一个节点为true则返回当前节点的值