java源码系列:HashMap源码验证,自己手写一个HashMap之02-写put方法以及思路、哈希冲突等

写put方法的思路

那接下来呢,我们就来写这个put的方法,那这个put的方法我们应该怎么去写呢?

1、首先第一步就把我们这个key呢,通过进行哈希,然后算出它的这个哈希code,

2、然后通过这个哈希code去取模,算出它的这个 index的下标,

3、然后通过这个下标呢,去找到这个数组所对应的这个对象,

就当前这个下标的这个节点的这个对象,然后通过这个对象,判断当前这个对象是否为空,

4、如果为空的话说明什么意思?如果为空的话,就说明不会出现冲突,可以直接赋值,进行存储,

5、那如果不为空呢,说明出现冲突了,那这个时候呢,要用链表进行存储,然后返回这个值就可以了。

整个的过程就是这样的一个过程。

步骤1:定义 哈希算法 方法

首先呢,定义一个哈希算法,然后这个哈希算法呢,它传入一个值是key,

然后呢,它会返回一个index这个值,

所以呢,我们接下来就写一下这个方法,那这个哈希算法怎么去实现呢?

其实非常简单,也就是说现在在这里的话,就返回这个值,这个值应该怎么去算呢?

其实就是拿到我们的这个index,这个值等于多少?

等于咱们这个key.hashCode,然后去取模,我这里取模16,

算出这个值,算出这个值它可能会出现负数,如果说我们出现负数的话,

我们这里会有问题,因为我们数组呢,它是从零开始的,

那如果说出现这个负数,那怎么去解决呢?

对,判断一下,如果当前这个值大于等于零的话,那我们就直接返回它。

如果它不等于零或小于零的话,那就让它负负得正,就取它的绝对值就可以了。

当然java里面提供的函数,也是可以支持的。

步骤2:判断是否有哈希冲突

好,那么现在我们计算出的这个下标,然后我们放到这个数组里面去,

然后它就会返回当前这个Entry对象,然后当前这个Entry对象。

如果空对象等于咱们这个Entry对象的话,那就说明什么呢?说明没有出现冲突。

我们上面的数据,存哪些值是没有冲突的?王五、陈二、李四,还有刘一

那为什么存刘一,没有冲突呢?

因为我们在插入存储刘一的时候,此时此刻它的下标位置是没有数据的,为空!

它是第一个进来存储的,所以它是没有冲突的!

那else的话就是咱们这个有冲突,那冲突的话无非就两个值,

一个就是咱们这个monkey,还有一个就是咱们这个张三,就这两个值,

步骤3:如果为空的话,赋值存储

所以呢,我们现在接下来,在这里就知道啊,如果是没有冲突的话,

非常好理解,就是赋值,就我们让这个table它的这个index呢,进行赋值,

就是我们在这里呢,拿到这个新值,赋值给这个下标,就可以了。

但是后面我们现在进入这里,那我们这个赋值这个内容写什么呢。内容写什么?

我们来思考一下内容写什么?内容无非就是我们插入的这些值吧,

那我们现在插入这些值的话,我们每一个下标返回的是一个Entry对象,

那这个Entry对象要存这些值的话,那我就要在这个Entry对象里面进行定义吧。

所以呢,我在这里来定义它们的key、value,以及对应他们的index这个值,

还有它的这个next对吧。生成它的有参构造,把这四个值加进去,对不对?

所以在 if(null == entry)的石化,我们主要干什么? 只要去new一个Entry对象,

然后呢,把我们要传入的,比如像我们的key、value,

以及它的这个哈希值(这里直接就取index的值即可),

然后next为空,因为这里王五、陈二、李四、刘一,他们的next都为空,

所以这里的赋值为空就可以了。

步骤4:如果不为空,代表冲突了,链表存储

好,else的话,那就存 monkey 和张三,那这个时候应该怎么办?

那这个时候呢,我要把这个值赋值过来,但是呢,我们现在已出现冲突了,

要去用链表的形式,那应该怎么办?

我们现在知道出现这种情况要用链表,那链表无非就用next这个元素,对吧,

因为这个next它就是一个指针,指针也就是链表,

那这个next元素,应该写什么内容呢?

我们来去思考一下,

当我去插这个monkey的时候,我当前的头节点,是张三,而张三去插入的时候,头节点是刘一。

也就是说我每一次插入的话,都是什么?

都是我上一次插入的这个节点。

所以,如上图,我现在这里要去插monkey,那我取出来,当前这个 next 是不是张三,那我把这个张三赋值给 next,那是不是就可以了。

1、而我当前在这个地方取出的这个节点值,是不是我即将要插入的这个节点位置里面的值,

那这个节点值,就是我即将插入之前的值。也就是 张三这个实体的值

2、所以我直接把这个Entry对象赋值给 next,是不是就可以。

对吧,就取出当前这个元素,我们把这个元素复制给它的指针。就可以实现,OK,

就这么简单,所以在这里呢,我们就可以通过在这里, 就直接把这个元素什么进行返回。

这里我们还要进行size++,因为我们的每增加一个元素,我们这个数组它要增加1,

好,我们已经把put的方法写完了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

被开发耽误的大厨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值