目录

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

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

为什么要用链表?

其他——布隆过滤器


取模会带来一个什么问题

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

同学们有没有听说一个叫做哈希冲突或者哈希碰撞。有听说过的同学可以给文章留言敲个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的这个数据里面,这个电话号码有重复的?

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

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

  1. Java集合源码系列(1)---- ArrayList详解

    目录 属性 构造函数 无参构造函数 含参构造(int initialCapacity) 含参构造(Collection c) add方法 add(E e) add(int index, E eleme ...

  2. java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题

    目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...

  3. java 源码系列 - 带你读懂 Reference 和 ReferenceQueue

    java 源码系列 - 带你读懂 Reference 和 ReferenceQueue https://blog.csdn.net/gdutxiaoxu/article/details/8073858 ...

  4. Java源码之HashMap

    Java源码之HashMap 转载请注明出处:http://blog.csdn.net/itismelzp/article/details/50525647 一.HashMap概述 HashMap基于 ...

  5. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  6. Caddy源码阅读(一)Run详解

    Caddy源码阅读(一)Run详解 前言 本次系列会讲解 caddy 整个生命周期涉及到的源码. 平时我们使用 caddy 都是使用 它的 二进制 分发文件,现在来分析 caddy 的 Run 函数. ...

  7. centos7 mysql 源码安装_CentOS7.4 源码安装MySQL8.0的教程详解

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...

  8. 仿抖音短视频APP源码,顶部导航栏切换详解

    仿抖音短视频APP源码,顶部导航栏切换详解的相关代码 class DaoHangNan extends StatefulWidget //继承StatefulWidget{TabController ...

  9. 华为OD机试(21-40)老题库解析Java源码系列连载ing

    华为OD机试算法题新老题库练习及源码 老题库 21.字符串序列判定 22.最长的指定瑕疵度的元音子串 23.处理器问题 24.单向链表中间节点 25.字符串重新排列.字符串重新排序 26.完美走位 2 ...

最新文章

  1. TVM交叉编译和远程RPC
  2. 适配器在JavaScript中的体现
  3. lua脚本简单编辑及常用指令
  4. zcmu1203(逆序对,归并排序)
  5. typescript get方法_使用 Typescript 构建类型安全的 Websocket 应用
  6. Java正则表达式获取网页所有网址和链接文字
  7. ​我敢说,这是最全的常用设计模式汇总
  8. 电脑无线网络与服务器共享,图文详解win7笔记本如何实现内置无线局域网卡共享...
  9. 回顾我个人的创业经历
  10. 019-Spring Boot 日志
  11. Nginx多进程高并发、低时延、高可靠机制在滴滴缓存代理中的应用
  12. [转]-Sublime Text 3最好的功能、插件和设置
  13. DevExpress DateEdit 5 常见问题解决方法
  14. netty 高匿ip检测_检测代理IP匿名程度的方法
  15. QQ浏览器的历史记录在那 QQ浏览器查看浏览历史的方法
  16. 《SEM长尾搜索营销策略解密》一一2.12 宝洁里的长尾与创新
  17. <小甲鱼>C++实例练习6—华氏温度与摄氏温度转换程序
  18. 英语流利说19秋招笔试总结
  19. CodinGame - Chuck Norris 思路
  20. java guardedby_JAVA多线程(五)模式-Guarded Suspension

热门文章

  1. 兵棋---棋盘绘制算法(六边形阵列算法)
  2. 小武学fpgastep6
  3. jquery控制div的显示与隐藏
  4. jmeter压测数据库
  5. SQL零基础入门学习(十)
  6. Nature子刊 | 褚海燕组-土壤生物多样性与城市绿地生态系统功能(朱永官/韦革宏点评)...
  7. 谷歌浏览器调试时页面的刷新与强制刷新+清空缓存的操作
  8. 菜鸟起步2-逆向分析学习
  9. 花样16流水灯c语言程序,8个花样流水灯c程序
  10. 图片分类的入门:二分类