关于java的HashMap

直入主题。点击如入HashMap的源码,我们能看到
这里写图片描述
map也是用数组实现的,只不过数组类型是
这里写图片描述
,而Entry也实现了Map,而我们实际上总是说的map key对应的其实是Entry的key。
接下来我们来看Entry的属性,我们能看到我们最熟悉的key、value、hash,但是next是什么呢?我们这里先保持下疑问。
接下来我们来看我们最常用的put方法,!
这里写图片描述
我们可以看出答题可以分四部分。第一,根据hashcode获得hash值;第二,根据hash值获得对应数组的index;第三,遍历对应数组的元素(在这里我们就可以看到Entry.next的作用了,看来Entry保存的是一个链,相同的hash值就可以保存在这个链里),如果找到key对应的值,然后将其替换,返回原来的值;第四,如果没有找到相同的key,就添加一个新的Entry。
接下来我们看addEntry这个方法,
这里写图片描述
从这个方法里能看出,e记原来的数组元素引用,然后new一个新的Entry将其赋值为数组元素引用,然后可以看出e也是有传入新Entry对象的,这样就可以说通了,e是赋予next的,这样原来的链不会丢失(可以通过第一个元素的next获得),每次添加进一个新都会成为新的header,这模式就是链表的结构了。后面我们还会hashmap根据自己策略进行扩容。
所以总体的来说,hash就是数组和链表的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值