一:什么叫做散列表 (哈希表)

散列表是存储key、value映射的一种集合。散列表也叫做哈希表
散列表底层也是数组,只是通过一种hash函数来计算他的key值

二:hash函数

在Java中每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身类型是什么,它们的hashcode都是一个整新变量。
计算hash函数(取模运算)
index=Hashcode(Key)%Array.length
在java中hash函数并没有直接采用取模运算,而是利用了位运算的方式来优化性能。

三:hash冲突

hash冲突是指在我们的散列表中,有两个不同对象他们的hash值是一样的。导致他们的key指不一样,计算出来的下标一样。
解决方法一:开放寻址法
当查找出来的下标被占用时,我们就 另谋高就 ,寻找下一个空挡位置
(ThreadLocal使用的就是开放寻址法)
解决方案二:链表法
在散列表中,每一个元素不仅是一个entry对象,还是每一个链表的头节点,每一个entry对象通过next指针指向它的下一个entry节点。当一个新的entry对象发生hash冲突时,就把该对象放入链表next中即可。

四:hashmap的读取操作

哈希表是由数组+链表组成的,数组的默认长度为16(可以自动变长。在构造HashMap的时候也可以指定一个长度),数组里每个元素存储的是一个链表的头结点。而组成链表的结点其实就是hashmap内部定义的一个类:Entity。
Entity包含三个元素:key,value和指向下一个Entity的next
我们通过元素的key计算它的hash值,拿到它的下标,查看对应的下标存储的key值对不对应。不对应就顺着链表的next一直往下找,直到找到尾节点或者找到相同匹配的key。

五:hashmap的扩容操作

hashmap有链表为什么要进行扩容呢?
当我们的散列表达到一定的饱和度时,key映射位置发生冲突的概率逐渐提高,这样一来,大量元素都会拥挤在相同数组下标位置,形成很长的链表。而我们链表查询是比数组慢的,时间复杂度是O(n)。
hashmap扩容方法?
hashmap的扩容因子是0.75,就是达到容量的百分之75就会进行扩容。
为什么扩容因子是0.75,因为数组容量越大,发生hash碰撞的概率也就越小,当数组满了之后,hash碰撞的概率会变得更高。)
1:扩容,创建一个新的entry空数组,长度是原来的两倍。
2:重新hash,遍历原来的Entry数组,把所有的Entry重新hash到新数组中。为什么要重新hash呢?
因为我们数组长度扩容后,我们hash函数也会进行改变,数组原来的key计算的hash值获取的下标也会进行改变。这样hashmap的hash冲突概率会减少,链表长度也会减少。查询插入速度也会更快。

hash函数(哈希表)相关推荐

  1. Two Sum (两数之和) - Hash Table (哈希表)

    Two Sum (两数之和) - Hash Table (哈希表) https://leetcode-cn.com/problems/two-sum/ Given an array of intege ...

  2. 不同表结构数据迁移_数据结构:哈希 哈希函数 哈希表

    写在前面 希望你们看了能够有所收获,同时觉得不错的朋友可以点赞和关注下我,以后还会有更多精选文章分享给大家!大家可以关注一下java提升专栏 java提升​zhuanlan.zhihu.com 什么是 ...

  3. hash:哈希表 哈希桶

    目录 1.哈希的思想 2.解决冲突 3.哈希表(采用的闭散列,线性探测) 4.哈希桶(开散列) 5.总结 1.哈希的思想 hash是hash是一种根据存储的关键字的哈希值确定存储位置的算法.哈希值通过 ...

  4. 解决Hash(哈希表)冲突的四种方案

    解决Hash(哈希)冲突的四种方案 参考&鸣谢 解决哈希冲突必须知道的几种方法 小僵鱼 你还应该知道的哈希冲突解决策略 vivo互联网技术 解决哈希冲突的三种方法 kaleidoscopic ...

  5. 重温数据结构:哈希 哈希函数 哈希表

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 在学习 HashMap 前,我们先来温习下 Hash(哈希) 的概念. 什么是 Hash Hash(哈希),又称" ...

  6. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  7. 哈希表(散列表)—Hash表解决地址冲突 C语言实现

    哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...

  8. 【散列表(哈希表) Hash Table(上)】:Word文档中的单词拼写检查功能是如何实现的?

    Word 这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word 的这个 ...

  9. 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希(散列)函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列(开放地址法) 开散列(链地址法/拉链法) 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) ...

  10. 什么是哈希,哈希表,哈希函数,哈希碰撞?

    什么是哈希? 比方我有个原始值,S=["老铁双击666",'感谢老铁送的飞机'], 通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是&quo ...

最新文章

  1. 《Swift 权威指南》——第6章,第6.7节常量和变量参数
  2. 面试:如何快速过滤出一次请求的所有日志?
  3. python编程输入标准-Python练习题,,T1.编写程序,输入
  4. 编程之美-蚂蚁爬杆方法整理
  5. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测
  6. 转:12个信号判断男人肾不好
  7. eclipse安装java web插件
  8. java语言程序设计教程翁恺第二版课后答案_《JAVA语言程序设计教程(第2版)/翁恺 肖少拥》翁恺,肖少拥著【摘要 书评 在线阅读】-苏宁易购图书...
  9. HTTP之get post
  10. idea怎么和mysql连接并执行_IDEA配置mysql数据库的操作
  11. spring data mongodb CURD
  12. js判断是对象还是集合
  13. WIN7安装FreeSwitch,1.8版本无法安装,1.6版本成功
  14. 如何构建自己的Java学习体系?
  15. Android 内存剖析 – 发现潜在问题
  16. Python快速入门(1)常用容器和内置函数介绍
  17. GIS(地理信息系统)
  18. Python判断字符串中连续最长的递增英文字母串
  19. 直接在浏览器运行Python代码
  20. 唯品会亿级数据服务平台实践

热门文章

  1. 新主播如何在直播行业混得好
  2. 【Scratch算法讲解】01-Scratch选择排序 少儿编程Scratch常见排序算法案例分析讲解
  3. mysql 生成一张全年日期表:工作日、周末、节假日
  4. 《Redis视频教程》(p20)
  5. 微信小程序登录授权开发
  6. inovance变频器说明书参数设置_汇川(INOVANCE)MD300A变频器说明书.pdf
  7. Elasticsearch对接Django
  8. 为什么是深度神经网络而不是宽度神经网络?增加神经网络的深度相比于增加宽度有哪些优点?
  9. 电容 电阻0201/0402/0603/等封装长宽高定义
  10. 基于C#语言Windows窗体应用(.Net Framework)的教室点名系统V1.0