今天背八股文的时候浅浅看了一下这个HashMap有关的一些东西
HashMap分为两个阶段
在JDK1.8之前,底层使用数组 + 链表来实现的
在JDK1.8之后,底层使用数组 + 链表 + 红黑树来实现
这里就涉及到三个东西,数组,链表,红黑树
首先先解释一下在JDK1.8之前的实现方式,我们都知道数组他是紧挨在一起的,如下
链表他不仅存储数据,还存储指向下一个数据的指针,就有点像是这样子的
那他们的数据存储呢,是Key-Value这种形式,他通过计算Key的哈希值,然后来定位到他在数组中存储的一个位置
其中还涉及到一个取模的东西,比如 love 这个key计算出来的哈希值是100 但是取模变成10 所以存在数组下标10的位置,大概就是这么一个意思啊
但是这里就会涉及到一个哈希碰撞的问题,就是两个不一样的东西他计算出来的hash值可能是相同的,这就是我们为什么说用hash值来比较两个东西是否相等不靠谱的原因。
这里的解决方式就是如果哈希值相同,就用链表的形式来存储,样子大概如下
然后就是JDK1.8之后的存储方式了,明明以及用链表可以解决,为什么还要引入红黑树?
就有这么一种情况,他数组的长度不长,但是链表的长度很长,这样的话查询起来就贼离谱,因为我们都知道链表的特点就是查询巨慢,他得把整个链表从头到尾过一遍,所以才引入了红黑树
但是这里红黑树我也不太懂,大概就变成了这个样子
这样其实可以很明显得看到了嘛,四个数据,但是只有两层,要是链表的话,就有四层了
有关红黑树的东西有兴趣的可以百度一下,这个玩意我也搞不懂,旋来旋去的,看着就烦