java源码系列:HashMap源码验证,自己手写一个HashMap之03-写get方法以及思路等

本文介绍了如何利用哈希算法实现get方法,通过计算键值的哈希下标,快速定位和对比元素,展示了从查询键到数据获取的简单流程。重点讲解了哈希冲突处理和链表存储的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那接下来我们还有一个方法,我们经常用到的还有一个什么,还有一个get方法,

那好,那这个地方呢,我给大家一种思路啊,既然我们put方法是采用这个哈希算法,

去确定我们相应的这个下标。

那同样的我们直接用这个get方法,也采用这个方式用哈希算法,

1、get方法传入key,key通过哈希算法算出来这个值,这个值就是它的下标,

2、然后通过下标,获取这个下标对应的元素,然后把元素里面的key与传入的key,

进行去对比,不就把数据,给查询出来了吗?

所以这个get方法啊,就相当于是什么呢?

相当于我a点可以到b点,难道我b点就不能返回到a点吗?

应该也是可以的,这个推理应该是没有任何毛病的,所以在这个地方,

我们的这个get方法,其实也是非常非常的简单,

没听懂没关系,来把这个源码给大家写一遍,下面我们图文并茂来演示一下

步骤1:

get方法传入的key,就是说首先是通过咱们这个key呢,进行这个哈希算法,哈希算法出来之后算出它的这个index,index就是这个下标,

然后呢,根据它的这个下标呢,去判断,这个下标对应的元素是否为空

如果为空的话,就直接返回null,没有找到对吧。

如果不为空的话,那就去什么呢,那就进行对比。

这个 table[index],相当于下面这个实体数组

步骤2:

get方法传入的key,也就是用我们查询的这个key,和当前元素的这个key呢,进行比较

如果相等的话,就直接取出这个数据,返回这个数据。

比如:我要去查,假设我要去查王五,王五通过传入的key通过哈希算法,算出来下标等于0,那我立马就拿到这个元素,

然后如果传入的key,和王五这个元素的key,他们相等,是不是就取出来了,就这么简单,

步骤3:

如果不相等的话,那怎么办呢?那就看一下当前这个节点的next是否为空,

如果为空的话,又是直接返回,

如果不为空,然后再去判断当前的这个查询的这个key,是否和当前取出来的那个key是否相等?

直到相等为止。

当然在这里呢,告诉大家,刚才我在这里讲,为什么我们除了这个next,

其实还有一个哈希值,我没有介绍对吧,这个哈希值就是去比较当前这个对象是否相等

那这就是我们整个的这个过程,这个过程看似这么复杂,其实非常简单。

代码纠正

在 next 获取对象的时候,漏掉了return,我们要在这加上,如下:

因为在我们测试的时候,你可以发现,在不加此 return 的情况下

 

你会发现,输出打印的值,张三和李四的值为 null

也就是出现哈希冲突后,转换为链表来存储值,链表的值没有获取到,所以它的值为 null 

如下图,我们debug一下,可以看到张三、李四,刚好是链表存储的,

也就是刚好对应我们没有加上 return,next引用的值获取的那块逻辑!

即我们要加上 return,才能取到 next 引用的值

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值