HashMap实现原理

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这个属性链接在一起。所以疑问不用担心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值