HashMap的前世今生

 花了一天多的时间,理解了什么是HashMap的数组-链表结构,什么是哈希算法,以下来表述下我所理解的数组-链表结构,以及哈希算法

(1) 哈希表的由来及原理

程序中的数据查询,使用最多的是List或者数组[]遍历查找,这些list,数组的特点是依次紧挨着排列。这种for循环有一个最大的弊端是每一次查询都需要将对应的数据源从头开始一个一个遍历过来,直到找到对应的值,这种查询方式效率较低。而哈希表通过给每一个对象一个固定的hash值,直接通过hash值是否存在来判断查询对象是否存在,免去了遍历的麻烦;类似于,有一个老师要给手头的学生安排座位。A同学,老师掐指一算,A的座位号应该是sfd; B同学,老师还掐指一算,B的座位号应该是dfd;……依次类推,计算出所有学生的座位号并安排好,前期的座位安排工作算做完了,同学都入座完了。随后,来了一个交到主任来找一个名字叫B的同学,老师听说要找的同学的名字叫B,于是老师又是掐指一算(算法和上面的掐指一算一样),这要找的B的座位号应该是dfd;于是,老师去座位dfd上找找看有没有人,有的话,那这个B同学算是找到了。至此,哈希算法基础原理完成,此处的座位号即查找对象对应的Hash值;

(2) 哈希算法的问题——哈希冲突

细看(1)中的座位安排描述,会有一个疑问,即:如果来了一个C同学,老师那算法一算发现C同学的座位号也应该是dfd,那不就和B同学的座位号冲突啦?这就是所谓的哈希冲突,dfd座位上B已经坐那里了,怎么安排C就是当前面临的问题。老师手头的算法主要希望算法结果可以使得Hash值分布均匀且不重复,但很难做到完全不重复,所以通过修改Hash表的表结构来解决冲突问题,引入数组-链表结构。

(3) 数组-链表结构

数组-链表结构的图示可以在很多文章中看到,大致是这样的:

图片来自以下链接:https://www.cnblogs.com/chengxiao/p/6059914.html,该链接中的文章关于HashMap原理也写得很详细,可耐心阅读。

最初看到类似上图的结构图时,我最大的疑惑在于下面的链是怎么一回事?链是怎么形成的?链里面的Entry怎么取值,怎么修改,怎么删除?……等等一系列的问题,不知如何下手。后来,在了解了哈希表的哈希冲突后,也就一目了然了。

链的产生其实就是解决了(2)中C同学怎么坐的问题。类似于在dfd座位旁边摆了很多小凳子,这些小凳子和dfd座位的共同点是他们的座位码都是dfd,但是彼此之前又前后用next,像一个小链条一样的连接起来,形成一个Hash值相同的一个小队伍。至此,HashMap数组-链表形成。

(4) HashMap判断元素是否存在

 HashMap增删改查的核心是针对HashMap中的Entry<K, V>进行操作。

step1:将给定的key值通过算法,转换成hash值;

step2:查询hashmap中是否存在对应的hash值;

step3:如果hash值存在,获取该hash值对应的数组链表Entry<K,V>[],循环判断链表中单个数组对象Entry<K,V>的key值是否与给定的key值相同,如果相同,则修改key值对应的value值为当前值,如果不存在相同的key值,则往该Entry<K,V>[]中新增该数组对象;如果hash值不存在,单独新增一个Entry<K,V>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值