HashMap其实也是由一个线性数组实现的,可以理解为其存储数据的容器就是一个线性数组,但是一个线性数组怎么可以存储键值对的数据呢?在这里,HashMap做了一些处理
1.首先HashMap里面实现了一个静态内部类Entry,其属性有key、value、next,我们很明显可以看得出来Entry就是HashMap键值对实现的一个基础Bean。上面说的HashMap存储的基础就是这个Entry[ ]数组,map里面的内容都保存在Entry[ ]里面。
2.既然是线性数组,那为什么能够随机存储?这里HashMap对键值对的存储不是按存储的顺序依次的将键值对存入Entry[ ]数组中的。
具体的流程是这样的,首先HashMap先将传入的key、value键值对构造为Entry对象,然后调用key.hashCode()并对Entry[].length求余得到该对象的在Entry[ ]数组中的下标index,然后再把该Entry对象存入Entry[index]中。
但是,在存储过程中两个不同的key调用key.hashCode()并对Entry[].length求余得到下标有可能是相同的,这个时候HashMap用到了链式数据结构的这个概念,上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方,第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A.一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。