java源码系列:HashMap底层存储原理详解——技术本质-原理过程-算法-取模会带来一个什么问题?

发布于:2023-01-07 ⋅ 阅读:(512) ⋅ 点赞:(0)

目录:

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

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

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

大家有没有听说一个叫做哈希冲突或者哈希碰撞。

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

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

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

我们还是通过这样一个方式,那我们现在在这里呢,我们还要存另外一个人的名字,

另外一个人的名字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的这个数据里面,这个电话号码有重复的?

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


网站公告

今日签到

点亮在社区的每一天
去签到