搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小桥流水78
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Windows本地部署文件传输神器LocalSend结合内网穿透轻松异地远程使用_local send
2
python求遍历、最短路径、最小生成树、旅行商问题并绘图展示_用bfs算法解决旅行商问题python
3
使用Flutter Snippets提升你的开发效率
4
多线程调用libcurl基于https会导致的crash_libcurl到底有什么毛病 多线程下使用总是崩溃
5
复现教程 | vs2022 编译Libmodbus (x86/x64/Release/Debug) vs2022调用Libmodbus_libmodbus库导入vs使用
6
超分辨率专题 | 3 种方法、4 个教程、10 个数据集,一文 Get 核心知识点_超分辨成像算法
7
【C++STL基础入门】list的增、删_c++ list删除指定元素
8
软件开发人员必备的人工智能工具:AI 编码工具与 Atlassian Intelligence
9
《昇思25天学习打卡营第12天|应用实践-自然语言处理-LSTM+CRF序列标注》
10
Makefile之删除目录中全部执行文件_make 删除文件夹里所有内容
当前位置:
article
> 正文
Java基础知识---解决hash冲突的几种方法_java 对象hashcode相撞 hashcode优化
作者:小桥流水78 | 2024-08-01 07:45:56
赞
踩
java 对象hashcode相撞 hashcode优化
解决
hash
冲突的几种方法
一. 两个不相等的对象可能会产生相同的hashcode
二. 开放定址法
①. 线性探测
②. 再平方探测
③. 伪随机探测
三. 链式地址法(HashMap的哈希冲突解决方法)
四. 再哈希法
五. 建立公共溢出区
六. 链式地址法和开放定址法比较
①. 链式地址法
②. 开放定址法
一. 两个不相等的对象可能会产生相同的hashcode
在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值,为了解决这个问题,一般都四种方式去解决。
产生哈希冲突的原因
哈希是通过对数据进行再压缩,提高效率的一种解决方法。但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的哈希值。
二. 开放定址法
开放寻址法的核心思想是,如果出现了散列冲突,我们就重新探测一一个空闲位置,将其插入。比如,我们可以使用线性探测法。当我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了,我们就从当前位置开始,依次往后查找,看是否有空闲位置,如果遍历到尾部都没有找到空闲的位置,那么我们就再从表头开始找,直到找到为止
①. 线性探测
按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。
②. 再平方探测
按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上先加1的平方个单位,若仍然存在则减1的平方个单位。随之是2的平方,3的平方等等。直至不发生哈希冲突。
③. 伪随机探测
按顺序决定哈希值时,如果某数据已经存在,通过随机函数随机生成一个数,在原来哈希值的基础上加上随机数,直至不发生哈希冲突。
三. 链式地址法(HashMap的哈希冲突解决方法)
对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。将哈希表的每个单元作为链表的头结点,所有哈希地址为 i 的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头结点的链表的尾部。
四. 再哈希法
对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。
五. 建立公共溢出区
建立公共溢出区存储所有哈希冲突的数据。
六. 链式地址法和开放定址法比较
①. 链式地址法
优点
①对于记录总数频繁可变的情况,处理的比较好(也就是避免了动态调整的开销)
②由于记录存储在结点中,而结点是动态分配,不会造成内存的浪费,所以尤其适合那种记录本身尺寸(size)很大的情况,因为此时指针的开销可以忽略不计了
③删除记录时,比较方便,直接通过指针操作即可
缺点
①存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销
②由于使用指针记录不容易进行序列化(Serializable)操作
②. 开放定址法
优点
①记录更容易进行序列化(Serializable)操作
②如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的
最后总结
拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,
拉链法中增加的指针域可忽略不计,因此节省空间;
在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,
删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小桥流水78/article/detail/913040
推荐阅读
article
Java
和调用智能合约出现 : Contract Call has
been
reverted
b...
由于自己更新的合约代码重新发布后没有把合约地址更新
Java
中的 配置文件出现该错误。记录下错误。_contract ...
赞
踩
article
RabbitMQ
实践——利用一致性
Hash
交换器
做负载
均衡
_
rabbitmq
hash
...
在中,我们熟悉了Direct、Fanout、Topic和Header这4种系统默认支持的
交换器
。这些
交换器
基本可以满足我...
赞
踩
article
【
Java
基础】
Java
线程
的
安全
性_
java
线程
安全
...
Java
线程
的
安全
性_
java
线程
安全
java
线程
安全
...
赞
踩
article
Java
项目
如何快速接入
AI
大
模型
ChatGPT
_
java
引入大
模型
...
笔记详细记录了Spring
AI
的功能、如何通过spring-ai快速对接
ChatGPT
,以及
项目
的配置和接口使用示例。...
赞
踩
article
Java
常见的
面试
题(
MySql
)_
java
mysql
面试
...
Java
常见的
面试
题(
MySql
)_
java
mysql
面试
java
mysql
面试
...
赞
踩
article
Java
线程
安全
的集合_
线程
安全
的
list
...
1. 前言在
Java
中我们使用最多的 List 就是 ArrayList 和 LinkedList,它们在单
线程
中可...
赞
踩
article
java
线程
安全
方法
_
java
线程
安全
的
方法
有几种?...
1、互斥同步互斥同步是最常见、最重要的并发正确性保障手段,也称为堵塞同步。同步是指在多条线路并发访问共享数据时,保证共享...
赞
踩
article
互联网
Java
工程师
面试题系列(
MySQL
面试题)_
java
工程师
mysql
测试题
...
1、
MySQL
中有哪几种锁?1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。...
赞
踩
article
java
线程
安全
的
类
型_
线程
安全
的
类
在
java
中有几种?如何成为
线程
安全
类
?...
上回我们说到了
在
java
有哪些集合是
线程
安全
的
,其实,
类
也可以是
线程
安全
的
,你们知道都有哪些
类
是
线程
安全
的
吗?快跟小编一...
赞
踩
article
Java
、
数据库
等
面试题
大全_
java
数据库
面试题
...
3. 笔试题之
Java
基础部分基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
赞
踩
article
Java 实现
线程
安全
的
方式
_
java
保证
线程
安全
的
方式
...
1.创建
线程
的
三种
方式
通过实现 Runnable 接口; 通过继承 Thread 类本身; 通过 Callable 和 ...
赞
踩
article
在
Java
程序
中怎么
保证
多线程
的
运行
安全?_在
java
程序
中怎么
保证
多线程
的
运行
安全?...
这种方式需要注意锁
的
粒度,使得锁住
的
代码块尽可能
的
短,以避免影响
程序
性能。3. 使用Lock对象:Lock是JDK提供
的
...
赞
踩
article
java
线程
是怎么
保证
安全
的
- 面试宝典_
java
如何
保证
线程
安全
...
还有其他一些方法可以帮助
保证
Java
线程
的
安全
性: 5. 使用
线程
安全
的
集合类:Java提供了一系列
线程
安全
的
集合类,如...
赞
踩
article
java
如何
保证
线
程
安全
_保障
线
程
安全
的 手段
java
...
CAS指令执行时,当且仅当V处的值符合旧预期值A时,处理器用B更新V处的值,否则它就不执行更新,但是无论是否更新了V处的...
赞
踩
article
【
Java
对象
转换】
003
-
Java
对象
与
Y
aml
互转_
java
撖寡情頧流
aml
...
【
Java
对象
转换】
003
-
Java
对象
与
Y
aml
互转文章目录【
Java
对象
转换】
003
-
Java
对象
与 Y...
赞
踩
article
java
:
java
.
lang
.
NoSuchFieldError
:
报错解决_
java
:
java
.l...
java
:
java
.
lang
.
NoSuchFieldError
:
Class com.sun.tools.
java
c....
赞
踩
article
java
基本微信
小
程序
的
讲座
预约
系统 uniapp
小
程序
...
本文介绍了使用微信
小
程序
技术开发
讲座
预约
系统的设计与实现过程,首先对实现该系统的技术进行分析,说明选择Java后台技术和...
赞
踩
article
Java+SSM+JSP实现
医院
预约
挂号
系统
_
java
预约
功能的设计思路...
网络的广泛应用给生活带来了十分的便利。所以把
医院
预约
挂号
管理与现在网络相结合,利用
java
技术建设
医院
预约
挂号
系统
,实现...
赞
踩
article
JSP 医院网上
预约
系统
myeclipse
开发
java
jsp
编程
mysql
数据库
_基于
jsp
...
一、源码特点 JSP 医院网上
预约
系统 是一套完善的WEB设计系统,对理解JSP
java
编程开发语言有帮助,系统具有...
赞
踩
article
医院
门诊预约挂号系统(
JAVA
,
JSP
,
SERVLET
,
MYSQL
)_
医院
预约挂号
系统管理员
,医生,...
医院
门诊预约挂号系统(
JAVA
,
JSP
,
SERVLET
,
MYSQL
)(毕业论文12000字以上,共42页,程序代码,My...
赞
踩
相关标签
区块链
java
solidity
rabbitmq
哈希算法
负载均衡
开发语言
线程
人工智能
chatgpt
面试
jvm
java 线程安全 方法
mysql
java 线程安全的类型
安全