• 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的这个数据里面,这个电话号码有重复的?

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

  • 相关阅读:
    web前端期末大作业:美食文化网页设计与实现——美食餐厅三级(HTML+CSS+JavaScript)
    11.Z-Stack协议栈使用
    “羊了个羊”是如何吸引住你的
    计网第五章(运输层)(三)(TCP和UDP的对比)
    多种控制率算法的实现案例(LQR、H无穷和神经网络算法等)(Matlab代码实现)
    深入探讨 AutoGPT:彻底改变游戏的自主 AI
    ansible User 模块
    UE4 拍摄、保存并浏览相册
    flinksql 回撤流中主键发生变更的影响(group by中的值发生改变)
    网络攻击的发展
  • 原文地址:https://blog.csdn.net/YuDBL/article/details/126419789