HashMap浅析

进来开发任务略轻,随即看了困扰笔者已久的集合框架中的hashMap工作原理(几乎每次面试都会被问到,而且每次都回答不清楚),学习以后为了加强记忆简单总结如下:


数据结构中有数组和链表两种存储结构,数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,插入和删除容易。hashMap则是使用了综合两者的特性,寻址容易,插入和删除也容易的哈希表数据结构。

hashMap的内部存储结构如下图(自己画的太丑):


从上图可以看出它的结构是由数组+链表组成的。


当我们往hashMap中存数据的时候,首先会对key进行hash算法得出它的hash值,然后通过hash(key)和数组的长度求得到该值应该放到数组的位置下标,再然后将key-value放到相应位置。然而不同的对象可能hash值相同,即使hash值不同计算的数组下标也会相同,这是就出现“碰撞”。这就要提到hashMap做的一些处理了。hashMap里面实现了一个静态内部类Entry,它有四个属性key、value、next和hash,key和value自然是存键值对,hash是存key的hash值,关键是next,当发生“碰撞”的时候,hashMap会把当前要存入的值的next指向已经存在数组该位置的Entry,然后再将该值存在数组对应位置。


当我们通过key从hashMap中取值得时候,先使用key的hash值求得该数据在数组的下标位置,然后使用key的equals方法进行比较,当前的不对则再比较next指向的Entry,直到找到,找不到则返回null。此处补充一点:因为value的值也可能真的就是null,所以如果要判断hashMap中是否存在某个key,不能用get(key)==null来判断,应该使用hashMap提供的方法containsKey()方法来判断。


先写这么些吧,其它问题后续再补充。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值