HashMap如何解决哈希冲突

news2024/11/26 10:30:34

HashMap如何解决哈希冲突

  • Hash算法和Hash表
  • Hash冲突
  • 解决哈希冲突的方法
    • 开放地址法
    • 链式寻址法
    • 再hash法
    • 建立公共溢出区

Hash算法和Hash表

Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。
在这里插入图片描述
Hash表又称为“散列表”,它是通过key直接访问到内存存储位置的数据结构。在具体的实现上,我们通过Hash函数把key映射到表中的某个位置,来获取这个位置的数据,从而去加快数据的查找。

Hash冲突

所谓的Hash冲突是由于哈希算法被计算的数据是无限的。而计算后的结果的范围是有限的。

所以总会存在不同的数据经过计算之后得到的值是一样的。那么这种情况下就会出现所谓的哈希冲突。

解决哈希冲突的方法

通常解决哈希冲突的方法有四种。

开放地址法

也称线性探测法,就是从发生冲突的那个位置开始,按照一定次序,从Hash表中去找到一个空闲的位置,然后把发生冲突的元素存入到这个位置。

而在Java中,ThreadLocal就用到了线性探测法来解决Hash冲突。
在这里插入图片描述
像这种情况,在Hash表索引1的位置存了一个key=name,再向它添加key=hobby的时候,假设Hash计算得到的索引也是1。那么这个时候,我们称为Hash冲突。而开放地址法就是按照顺序向前去找到一个空闲的位置来存储这个冲突的key。

链式寻址法

把存在Hash冲突的key以单向链表的方式来进行存储。比如HashMap就用到了链式寻址法来实现。
在这里插入图片描述
存在冲突的key直接以单向链表的方式去进行存储。

再hash法

某个Hash函数计算的Key存在冲突的时候,再用另外一个Hash函数对这个Key进行Hash,一直运算直到不再产生冲突为止。

这种方式会增加计算的时间。性能上会有一些影响。

建立公共溢出区

把Hash表分为基本表和溢出表这两个部分。凡是存在冲突的元素一律放到溢出表中。

HashMap在JDK 1.8版本中是通过链式寻址法以及红黑树的方式来解决Hash冲突问题的。

其中红黑树是为了优化Hash表的链表过长导致时间复杂度增加的一个问题。当链表长度大于8摈弃给Hash表的容量大于64的时候,再向链表中添加元素,就会触发链表向红黑树的一个转换。

参考资料:【Java面试】数据结构面试必问题,HashMap如何解决哈希冲突?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVS负载均衡群集部署——DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题 二、LVS负载均衡群集-DR模式部署1.配置nfs共享(192.168.154.10)2.部署第一台nginx服务(192.168.154.11)3.部署第二台nginx服务(192.168.154.12&#xf…

React入门学习

参考资料:https://bright-boy.gitee.io/technical-notes/#/react/React%E5%85%A5%E9%97%A8 https://github.com/xzlaptt/React react学习01: https://docs.qq.com/doc/DSG1jdUJtQ3FYR1V1 react学习02: https://docs.qq.com/doc/DSGhGZk9PUm1KVldv React简介 框架定…

滚动数组-动态规划之-不同路径 II_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中,从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度,更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用,在常规的动态规划中&#xff0…

SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)

前端打包部署 前端项目为vue项目,使用vue admin template作为后台管理模板进行开发。 前端打包 了解开发环境、生产环境,修改生产环境的配置 在开发的时候,往往使用本地电脑进行开发。但是项目上线的时候,需要部署到云服务器中…

基于二阶锥规划(SOCP)松弛和线性离流的配电网规划(DNP)方法示例(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 配电网最优潮流 Optimal Power Flow, OPF) 问题是指在满足一定约束条件的情况下,通过控制配电网中的可控变量&…

内网Nexus代理docker-ce(yum) 源私有仓库 + 内网设备配置(centos)

配置docker-ce源 这里也是以阿里云的docker-ce源为例。 源地址为:https://mirrors.aliyun.com/docker-ce/linux/centos 1、在nexus上配置代理 Nexus上创建Blob Stores 创建Repositories 点击设置 - -> Repositories -- > Create repository --> yum(p…

分布式消息队列Kafka(二)- 生产者

1.生产者消息发送流程 (1)消息发送原理 ​ 在消息发送的过程中,涉及到了两个线程——main线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator,Sender 线程不断…

刘浩:当谈到RTO < 8s时,OceanBase究竟在说什么?

本文为 OceanBase 高级技术专家刘浩在第一届 OceanBase 开发者大会带来的分享。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 3 月 25 日,第一届 OceanBase 开发者大会在北京举行,OceanBase 高级技术专家刘浩为大家带来了…

VuePress打包后没有样式或者没有图片或者js加载失败

原因是没有部署到服务器上!!! 这可能是我们打包后的东西 直接点击index.html 变成这样了!!什么样式都没有了,怎么办那? 很简单,找个服务器部署以下就什么都有了!&…

NC 打开系统提示“安全日志数据源异常,请联系环境管理员处理”

问题:NC 用的是sql sever数据库,在sysConfig中正常配置好数据源后,点击测试,测试通过,但是打开系统后还提示“安全日志数据源异常,请联系环境管理员处理”,如下图: 原因:…

echarts 画中国地图

数据可视化平台,中国各省数据和坐标 阿里云可视化 效果 使用echart画中国地图,步骤如下 1.安装依赖 npm i echarts4 创建一个js文件 当你可以访问https请求的时候则使用,如下代码 import axios from "axios"; export default a…

网络安全SSRF漏洞 检测

SSRF 检测的一些思考 DNS 平台没有立刻收到请求,是在之后的某个时间段收到了不同的请求信息,这至少表明了一点,此处存在有无回显的 SSRF,虽然想要证明有更大的危害比较困难,但是至少说明了存在有 SSRF 的风险&#xf…

AI机器人ChatGPT使用体验(注册,使用,简易方式)

最近ChatGPT很火 号称下一代搜索引擎 吊打谷歌百度 它可以做到代替很多职业 究竟有多厉害呢? 看看这个例子: 你问他答,是不是感觉啥都知道? 文员、程序员全被打败 这个究竟怎么用呢? 注册 国内99%的人都卡在了…

超详细Docker的安装以及Docker部署C++

系列文章目录 这学期,学校开了一门云计算大数据课程,老师要求从OpenStack、Hadoop、Docker等软件进行部署一个框架。 我去从中选择了一个Docker,来对这个作业进行实现。以下就是我对这次作业的实现过程以及注意事项,还有犯的错误总…

牛客网Verilog刷题——VL27

牛客网Verilog刷题——VL27 题目答案 题目 请编写一个序列检测模块,检测输入信号(a)是否满足011100序列, 要求以每六个输入为一组,不检测重复序列,例如第一位数据不符合,则不考虑后五位。一直到…

【C++】反向迭代器的设计

前言 STL中不少的容器需要有迭代器这样的设计,特别是正向迭代器,几乎每个容器都有自己的特定实现方式,有了正向迭代器之后,我们还要提供反向迭代器以供一些特殊的需求,但是许多容器的正向迭代器实现的方式不一样&#…

华东师范大学副校长周傲英:未来,中国需要什么样的数据库?

本文为华东师范大学副校长,CCF 会士周傲英教授在第一届 OceanBase 开发者大会带来的分享。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 3 月 25 日,第一届 OceanBase 开发者大会在北京举行,华东师范大学副校…

AI智能智能课程第四讲 -数据库领域专家

使用chatGPT让你成为数据库领域专家 作业 现在要测试电商的下单功能:测试员张三在公司的电商平台上下了几个单,现在需要验证:张三这个客户下单的所有订单信息,包含订单编号,商品名称,商品价格,…

什么是gpt4-如何用上gpt-4

gpt4主要强化了哪些功能 OpenAI尚未公布GPT-4的详细信息,不过可以根据OpenAI前CEO Sam Altman在2020年所发表的一篇博客中提到的,GPT-4可能会具有更强大和智能的能力,包括更准确的理解和表达自然语言、更高效的记忆和推理、更全面的知识和视…

thinkphp:数值(保留小数点后N位,四舍五入,左侧补零,格式化货币,取整,生成随机数,数字与字母进行转换)

一、保留小数点后N位/类似四舍五入(以保留小数点后三位为准) number_format()函数:第一个参数为要格式化的数字,第二个参数为保留的小数位数 方法一: public function test() {$num 12.56789; // 待格式化的数字$r…