java源码系列:HashMap底层存储原理详解——5、技术本质-原理过程-算法-取模会带来一个什么问题?什么是哈希冲突?为什么要用链表?

目录

取模会带来一个什么问题?

演示什么是哈希冲突(哈希碰撞)?

为什么要用链表?

其他——布隆过滤器


取模会带来一个什么问题

好,那同学们这样他能达到一个目的,但是呢,它也会带来的一个问题,那它会带来一个什么问题呢?

同学们有没有听说一个叫做哈希冲突或者哈希碰撞。有听说过的同学可以给文章留言敲个1。

所以回答这个哈希算法的底层实现是:哈希冲突、哈希碰撞,这是不对的。

我们用到了取模,用到了位运算,所以才会导致哈希冲突、才会导致哈希碰撞。

演示什么是哈希冲突(哈希碰撞)?

同学们,我们认真来看看这里。我们还是通过这样一个方式,那我们现在在这里呢,我们还要存另外一个人的名字,

另外一个人的名字foes,那我们现在这个foes和lies呢,我们算出他们的ascii码呢,都是108、105、101、115,

那我们这几个值进行相加的话,这两个人的英文名字ascii码都是等于429,而我们现在这个数组的长度就等于10,

同样的一个情况下,就是我们的分子和分母都不改变的情况下,那我们算出的这个下标结果都是等于9吧。

这就是出现了哈希冲突(碰撞)了!

为什么要用链表

那同学我们来思考一下:

刚才我们这个数组,如果我们在这里定义为下标等于9,赋值数值为2,后面又赋值等于400,

那同学我想问一下,我取出来的这个值是多少?

我取出来的值最终只会是400,而这个2会被覆盖掉了。那为什么会覆盖掉呢?因为我们数组它每一个下标,它只能存一个元素。

所以在这里,为什么要用链表的原因?就是为了去解决这个哈希冲突的问题,

因为我们数组在一个下标下,它只会存一个节点,或者叫一个元素。但是在这里呢,我们又存两个人的key,而这两个人的key呢,

它又要符合我们 HashMap 的一个查询方式,就是说虽然他们底层的 ascii 都一样,但是这两个人的名字不一样,所以这两个人他都可以查询出来,

所以这就是为什么要用链表,链表就是去解决哈希冲突的问题。

好,那现在同学们,我们就已经了解哈希算法。包括我们哈希算法它底层的冲突问题,

包括我们哈希算法底层可以用MD5实现,也可以用哈希码实现,等等这些都可以实现。

其他——布隆过滤器

包括同学们,我问大家有没有去学过那个叫做布隆过滤器,有没有同学听说过或者学过或知道。

他底层也跟这个有关啊,包括还有一个点,同学们我再给大家讲啊,就是经常去一些大公司去面试,比如像他这样说,

给你这个3到4TB的数据,然后这个数据里面存的都是手机号,请问如何去排查这3到4TB的这个数据里面,这个电话号码有重复的?

你怎么去做?那这个问题,其实他本质上也是哈希的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

被开发耽误的大厨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值