hashmap存储方式 hash碰撞及其解决方式

article/2025/11/11 2:38:32
1.Map 的存储特点
Map 这个结构中,数据是以键值对(key-value)的形式进行存储的,每一个存储进 map 的数据都是一一对应的。
创建一个 Map 结构可以使用 new HashMap() 以及 new TreeMap() 两种方式,两者之间的区别是: TreeMap 是支持 排序的。
2.HashMap 的底层存储方式

 

总结 :
1. hashMap 存储数据 (key,value) 的时候使用 put 方法
2. put 方法会调用 putVal 方法 , hash(hey) 和当前的 key value 作为参数传进来
3. 判断数组是否为空,即判断是否是第一次添加数据 , 如果是的话,会先调用 resize 方法扩容
4. 之后 , 根据当前 key hash 值找到它在数组中的下标 ( 怎么算的 ? index = (n - 1) & hash) ,判断当前下标位置是 否已经存在元素
5. 如果不存在,直接把 key value 包装成 Node 节点作为链表头存入数组
6. 如果存在,分为三种情况
1. )比较一下已有数据和存入数据 如果 hash 值等于传过来的 hash ,并且他们的 key 值也相等 最后会把 value的值覆盖处理
2. )上一步不相等,就判断一下当前是不是红黑树结构,是则调用 putTreeVal() 把它加入到红黑树
3. )既不相等,也不是红黑树结构,说明是普通链表结构,遍历这个链表,将数据存到链表尾部
1. 在遍历过程中,如果是最后一个节点,则插入新节点 newNode(hash, key, value, null)
2. 如果链表长度超过了 8 ,则转化为红黑树 treeifyBin(tab, hash) 3. 如果遍历的时候遇到了相同的 key value 的值覆盖处理
7. 如果当前数组中的元素个数超过阈值,则扩容 resize();
8. putVal ()方法 没修改 value 就返回 NULL 修改了就返回旧值(之前的 value
3. 什么是 hash 碰撞
Hash Collision 就是我们说的 Hash 碰撞或者 Hash 冲突。
这个其实也非常好理解,就是 2 个输入不同的数据,经过 Hash 算法后,得到的 Hash 值是一样的。
HashMap 的查询和添加过程中,绕不过去的是计算元素在数组的位置 index key HashCode 作为这个计算的 基础。计算后的Hash 值存在相同的情况, hash 与长度取余的结果也有相同的情况,这个时候运算结果相同的两个 对象就需要存储到同一个链表中,这就是HashMap 中的 Hash 碰撞。
4. 如何解决 hash 碰撞
1. 开放地址方法
1 )线性探测
按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上往后加一个单位,直至不发生哈希冲突。 就是在
此空间不足时,直接放入此空间的后一个空的空间
2 )再平方探测
按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上先加 1 的平方个单位,若仍然存在则减 1 的平方个
单位。随之是 2 的平方, 3 的平方等等。直至不发生哈希冲突。 要注意平方不能超过容量的值 Size=16 的时候,找备
选的单元只能取 i=1,2,3 ,也就是距离冲突单元 1,4,9 个单位的位置了。
3 )伪随机探测
按顺序决定值时,如果某数据已经存在,通过随机函数随机生成一个数,在原来值的基础上加上随机数,直至不发
生哈希冲突。
2. 链式地址法( HashMap 的哈希冲突解决方法)
对于相同的值,使用链表进行连接。使用数组存储每一个链表。 就是 hashmap 的底层原理 :数组 + 链表 就是没有
红黑树
补充:在 JDK1.8 HashMap 通过链式寻址法以其红黑树来解决哈希冲突的,其中红黑树是为了优化哈希表的链表
过长 导致遍历时间复杂度增加的问题。当链表长度大于 8 并且哈希表的容量大于 64, 再向链表中添加元素 , 会转化为
红黑树。 优点:
1 )拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较
2
由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况; (
3 )开放定址法为
减少冲突,要求装填因子 α 较小,故当结点规模较大时会浪费很多空间。而拉链法中可取 α≥ 1 ,且结点较大时,拉 链法中增加的指针域可忽略不计,因此节省空间; (
4 )在用拉链法构造的散列表中,删除结点的操作易于实现。
只要简单地删去链表上相应的结点即可。 缺点:
1 ) 指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。
3. 建立公共溢出区
建立公共溢出区存储所有哈希冲突的数据
4. 再哈希法
对于冲突的哈希值再次进行哈希处理,直至没有哈希冲突。
5. 如何解决并发
HashMap 的线程不安全主要体现在下面两个方面:
1. JDK1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况。 2. JDK1.8 中,在并发执行 put 操作时会
发生数据覆盖的情况。 1 if((p = tab[i =(n -1)& hash])==null)// 1 、此处线程不安全 —— 用来判定索引位置是否
hash 碰撞,比如两个线程 A B 都在进行 put 操作,并且 hash 函数计算出的插入下标是相同的,当线程 A 执行完第六
行代码后由于时间片耗尽导致被挂起,而线程 B 得到时间片后在该下标处插入了元素,完成了正常的插入,然后线
A 获得时间片,由于之前已经进行了 hash 碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致 了线程B 插入的数据被线程 A 覆盖了,从而线程不安全。
2 if (++size > threshold) 中的 ++size :同样还是线程 A B ,这两个线程同时进行 put 操作时,假设当前 HashMap
zise 大小为 10 ,当线程 A 执行到此行代码时,从主内存中获得 size 的值为 10 后准备进行 +1 操作,但是由于时间片
耗尽只好让出 CPU ,线程 B 快乐的拿到 CPU 还是从主内存中拿到 size 的值 10 进行 +1 操作,完成了 put 操作并将
size=11 写回主内存,然后线程 A 再次拿到 CPU 并继续执行 ( 此时 size 的值仍为 10) ,当执行完 put 操作后,还是将
size=11 写回内存,此时线程 A B 都执行了一次 put 操作,但是 size 的值只增加了 1 ,所有说还是由于数据覆盖又导
致了线程不安全。
解决方法: 1.Hashtable
HashTable 为了实现多线程安全,在几乎所有的方法上都加上了 synchronized 锁(锁的是类的实例 , 也就是整个
map 结构),当一个线程访 问 Hashtable 的同步方法时,其他线程如果也要访问同步方法,会被阻塞住。
2.Collections.synchronizedMap( 一般不用 ) 缺点 : 从锁的角度来看,基本上是锁住了尽可能大的代码块 . 性能会比较
3.ConcurrentHashMap (常用) JDK 1.7 中,采用分段锁的机制,实现并发的更新操作,底层采用数组 + 链表的 存储结构,包括两个核心静态内部类 Segment HashEntry 。 ①、 Segment 继承 ReentrantLock (重入锁) 用
来充当锁的角色,每个 Segment 对象守护每个散列映射表的若干个桶; ②、 HashEntry 用来封装映射表的键 - 值 对; ③、每个桶是由若干个 HashEntry 对象链接起来的链表 分段锁: Segment 数组中,一个 Segment 对象就是一 把锁, 对应一个 HashEntry 数组 , 该数组中的数据同步依赖于同一把锁 , 不同 HashEntry 数组的读写互不干扰
JDK 1.8 中抛弃了原有的 Segment 分段锁,来保证采用 Node + CAS + Synchronized 来保证并发安全性。取消类 Segment,直接用 table 数组存储键值对;当 Node 对象组成的链表长度超过 TREEIFY_THRESHOLD 时,链表转换
为红黑树,提升性能。底层变更为数组 + 链表 + 红黑树。 CAS 性能很高,但 synchronized 之前一直都是重量级的 锁,jdk1.8 引入了 synchronized ,采用锁升级的方式。

http://chatgpt.dhexx.cn/article/G3SMC61R.shtml

相关文章

Java Hash 碰撞

散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。 该函数将数据打乱混合…

通俗解释hash碰撞是什么以及如何解决

Hash如何存数据 hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。 如下图: 这里的学号是个key,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是下标值,用来确定这个Entry要存放在哈希表中哪个位置。 H…

Hash碰撞

Hash碰撞 什么是Hash碰撞 Hash碰撞是指两个不同的输入值,经过哈希函数的处理后,得到相同的输出值,这种情况被称之为哈希碰撞。 例如:两个不同的对象(object1和object2的值)经过Hash函数计算后的&#xf…

浅谈“越权访问”

一:漏洞名称: 越权访问漏洞 描述: 越权访问,这类漏洞是指应用在检查授权(Authorization)时存在纰漏,使得攻击者在获得低权限用户帐后后,可以利用一些方式绕过权限检查,访…

逻辑越权——垂直、水平越权

水平越权:通过更换的某个ID之类的身份标识,从而使A账号获取(修改、删除等)B账号数据。 垂直越权:使用低权限身份的账号,发送高权限账号才能有的请求,获得其高权限的操作。 未授权访问&#xff1…

横向越权和纵向越权(水平越权、垂直越权)

越权:顾名思义,就是获得了本不应该有的权限。 我们都喜欢创造一些复杂的词汇,而实际上这些词就是一个代词,根本没有那么复杂。 越权漏洞往往是基于业务逻辑的漏洞,这样的漏洞很难被WAF保护。 越权的分类 按照方向…

越权访问

目录 概念 分类 pikachu--水平越权 源码分析 pikachu---垂直越权 源码分析 概念 越权访问(Broken Access Control,BAC)是web中一种常见的漏洞,且越权漏洞属于逻辑漏洞,是由于权限校验的逻辑不够严谨导致的,所以越…

Web 攻防之业务安全:越权访问漏洞 测试.

Web 攻防之业务安全:越权访问漏洞 测试. 由于没有对用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超级管理员)范围内的操作。(比如:通过更换的…

越权漏洞系列

0x01:越权的定义 越权漏洞是我们在测试过程中遇到比较多的漏洞,我们可以这样来理解越权漏洞,一个用户A一般只能够对自己本身的信息进行增删改查,然而由于后台开发人员的疏忽,没有在信息进行增删改查时候进行用户判断&…

java越权问题

关于java项目越权问题 问题描述实现思路具体代码 项目上线前做了安全扫描,安全部门扫描出一个关于越权的问题。这个问题是在刚开始开发接口的时候没有考虑到的一个事情。(此项目是有关于用户所拥有的项目和活动权限的问题。) 问题描述 首先…

越权 漏洞

一、越权漏洞描述 越权访问(Broken Access Control,简称 BAC)是 Web 应用程序中一种常见的漏洞,由于其存在范围广、危害大,被 OWASP 列为 Web 应用十大安全隐患的第二名。 该漏洞是指应用在检查授权时存在纰漏&#x…

详解越权漏洞

文章目录 1.1. 漏洞原理1.2. 漏洞分类1.2.1. 水平越权1.2.2. 垂直越权 1.3. 漏洞举例1.3.1. 水平越权1.3.2. 垂直越权 1.4. 漏洞危害1.5. 修复建议 1.1. 漏洞原理 越权漏洞是指应用程序未对当前用户操作的身份权限进行严格校验,导致用户可以操作超出自己管理权限范…

网络安全笔记 -- 逻辑越权(水平垂直越权)

1. 逻辑越权 越权: 水平越权、垂直越权登录 暴力破解本地加密传输Cookie脆弱Session劫持密文对比认证 业务: 订单ID、手机号码、用户ID、商品ID等数据: 支付篡改、数量篡改、请求重放等找回: 客户端回显、Response状态值、Sessio…

渗透测试-越权漏洞之垂直越权和水平越权

越权漏洞之垂直越权和水平越权 文章目录 越权漏洞之垂直越权和水平越权前言一、什么是越权漏洞以及漏洞产生的原因1. 什么是越权漏洞2. 漏洞产生的原因 二、水平越权和垂直越权以及防御方法1.水平越权和垂直越权2.越权漏洞的防御方法 总结 前言 一、什么是越权漏洞以及漏洞产生…

【web安全】——逻辑漏洞之越权漏洞

作者名:Demo不是emo 主页面链接:主页传送门创作初心:一切为了她座右铭:不要让时代的悲哀成为你的悲哀专研方向:网络安全,数据结构 每日emo:希望我失望的日子过的快些 目录 一.越权漏洞简介 二…

怎样进行越权测试?

要了解越权测试,首先要先了解什么是越权攻击。越权攻击顾名思义就是超越了自己的权限范围,是指用户通过某种方式获取到了不属于自己的权限。越权攻击分为水平越权和垂直越权。下面我们先来说一下水平越权水平越权:攻击者尝试访问与他权限相同…

越权漏洞

什么是越权漏洞? 越权漏洞指的是应用在检查授权时存在纰漏,可以让攻击者获得低权限用户账户后,利用一些方式绕过权限检查,可以访问或者操作其他用户或者更高权限,而越权漏洞是属于业务性漏洞,困难在于这类…

水平越权与垂直越权

文章目录 越权漏洞简介水平越权概念常见场景实例 垂直越权概念常见场景实例 越权漏洞简介 越权,顾名思义,就是超出了权限或权力范围。多数WEB应用都具备权限划分和控制,但是如果权限控制功能设计存在缺陷,那么攻击者就可以通过这…

水平越权垂直越权

#知识点: 1、水平越权-同级用户权限共享 2、垂直越权-低高用户权限共享 3、访问控制-验证丢失&取消验证&脆弱验证 4、脆弱验证-Cookie&Token&Jwt等 解释 水平越权 就是同级用户之间的越权,打个比方现在有ABC三个用户,A…

越权漏洞详解

文章目录 Over Permission越权风险问题概述漏洞产生条件常见越权漏洞水平越权(平行越权)概述pikachu靶场练习1 垂直越权概述pikachu靶场练习 修复建议练习 Over Permission 越权风险问题 越权访问(Broken Access Control,简称BA…