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的这个数据里面,这个电话号码有重复的?
你怎么去做?那这个问题,其实他本质上也是哈希的问题。
java源码系列:HashMap底层存储原理详解——5、技术本质-原理过程-算法-取模会带来一个什么问题?什么是哈希冲突?为什么要用链表?相关推荐
- Java集合源码系列(1)---- ArrayList详解
目录 属性 构造函数 无参构造函数 含参构造(int initialCapacity) 含参构造(Collection c) add方法 add(E e) add(int index, E eleme ...
- java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题
目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...
- java 源码系列 - 带你读懂 Reference 和 ReferenceQueue
java 源码系列 - 带你读懂 Reference 和 ReferenceQueue https://blog.csdn.net/gdutxiaoxu/article/details/8073858 ...
- Java源码之HashMap
Java源码之HashMap 转载请注明出处:http://blog.csdn.net/itismelzp/article/details/50525647 一.HashMap概述 HashMap基于 ...
- Mybatis源码学习(三)SqlSession详解
前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...
- Caddy源码阅读(一)Run详解
Caddy源码阅读(一)Run详解 前言 本次系列会讲解 caddy 整个生命周期涉及到的源码. 平时我们使用 caddy 都是使用 它的 二进制 分发文件,现在来分析 caddy 的 Run 函数. ...
- centos7 mysql 源码安装_CentOS7.4 源码安装MySQL8.0的教程详解
MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以下为本人2018.4.23日安装过程的记录.整个过程大 ...
- 仿抖音短视频APP源码,顶部导航栏切换详解
仿抖音短视频APP源码,顶部导航栏切换详解的相关代码 class DaoHangNan extends StatefulWidget //继承StatefulWidget{TabController ...
- 华为OD机试(21-40)老题库解析Java源码系列连载ing
华为OD机试算法题新老题库练习及源码 老题库 21.字符串序列判定 22.最长的指定瑕疵度的元音子串 23.处理器问题 24.单向链表中间节点 25.字符串重新排列.字符串重新排序 26.完美走位 2 ...
最新文章
- TVM交叉编译和远程RPC
- 适配器在JavaScript中的体现
- lua脚本简单编辑及常用指令
- zcmu1203(逆序对,归并排序)
- typescript get方法_使用 Typescript 构建类型安全的 Websocket 应用
- Java正则表达式获取网页所有网址和链接文字
- ​我敢说,这是最全的常用设计模式汇总
- 电脑无线网络与服务器共享,图文详解win7笔记本如何实现内置无线局域网卡共享...
- 回顾我个人的创业经历
- 019-Spring Boot 日志
- Nginx多进程高并发、低时延、高可靠机制在滴滴缓存代理中的应用
- [转]-Sublime Text 3最好的功能、插件和设置
- DevExpress DateEdit 5 常见问题解决方法
- netty 高匿ip检测_检测代理IP匿名程度的方法
- QQ浏览器的历史记录在那 QQ浏览器查看浏览历史的方法
- 《SEM长尾搜索营销策略解密》一一2.12 宝洁里的长尾与创新
- <小甲鱼>C++实例练习6—华氏温度与摄氏温度转换程序
- 英语流利说19秋招笔试总结
- CodinGame - Chuck Norris 思路
- java guardedby_JAVA多线程(五)模式-Guarded Suspension