首页 > 其他分享 >HashMap是如何解决哈希冲突的?

HashMap是如何解决哈希冲突的?

时间:2024-08-02 08:58:31浏览次数:7  
标签:Hash HashMap 哈希 链表 冲突 key hash

1.要了解Hash冲突,首先要先了解Hash算法和Hash表

(1)Hash 算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是散列值.

(2) Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结构,在具体实现 上,我们通过 hash 函数把 key 映射到表中的某个位置,来获取这个位置的数据,从而加快查 找速度。 (3) 所谓 hash 冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总 会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。 2.解决Hash冲突的方法 (1) 开放定址法,也称为线性探测法,就是从发生冲突的那个位置开始,按照一定的次序从 hash 表中找到一个空闲的位置,然后把发生冲突的元素存入到这个空闲位置中。 ThreadLocal 就用到了线性探测法来解决 hash 冲突的。 (2) 链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突的 key,以单向 链表的方式来存储,比如 HashMap 就是采用链式寻址法来实现的。 (3) 再 hash 法,就是当通过某个 hash 函数计算的 key 存在冲突时,再用另外一个 hash 函 数对这个 key 做 hash,一直运算直到不再产生冲突。这种方式会增加计算时间,性能影 响较大。 (4) 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡是存在冲突的元素, 一律放入溢出表中. 3.HashMap 在 JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决 hash 冲突问题,其中红黑树是为了优化 Hash 表链表过长导致时间复杂度增加的问题。当链表长度大于 8 并且 hash表的容量大于 64 的时候,再向链表中添加元素就会触发转化。

标签:Hash,HashMap,哈希,链表,冲突,key,hash
From: https://blog.csdn.net/qq_55846232/article/details/140860028

相关文章

  • TA-lib安装与Conda冲突
    尽管我已经尝试了在StackOverflow上找到的一些解决方法,但我仍然无法在我的conda环境中安装TA-Lib。看来需要更新的Python版本,尽管我的Python版本已经是最新的了。请看下文。(base)C:\Users\salva>condaactivateUUSeRR(UUSeRR)C:\Users\salva>mambainstallTA-lib......
  • # 代码随想录二刷(哈希表)
    代码随想录二刷(哈希表)三数之和思路反正对于我来说是真的难想出来。若这道题还是采用哈希表的思路去做,非常麻烦,并且还要考虑去重的操作。所以这道题其实用双指针,是更方便的。具体程序如下:classSolution:defthreeSum(self,nums:List[int])->List[List[int]]:......
  • HashMap
    HashMap0.题目地址设计哈希映射1.链地址法classMyHashMap{classNode{privateintkey;privateintvalue;publicNode(intkey,intvalue){this.key=key;this.value=value;}}private......
  • HashMap 详细解析
    HashMapHashMap是Java的一种键值对容器,该容器的核心方法是putVal方法,为了提高查询稳定性,Java团队向该类引入了红黑树结构,为了减少碰撞概率引入了扰动函数,在对象的哈希值相同时又调用了equals方法进行二次检测泊松分布*树形节点的大小是普通节点的两倍*桶的数量和......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • 亲测有效!!![INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
    找到安装包下“\stage\cvu\cvu_prereq.xml”,复制一份,然后,打开这个xml,删除<CERTIFIED_SYSTEMS></CERTIFIED_SYSTEMS>之间的全部内容。原文件代码:<SPACE> <LOCVAR="CRS_HOME"SIZE="3.59"UNIT="GB"SEVERITY="IGNORABLE"......
  • T-SQL——关于安装 Mcrosoft.ACE.oledb.16.0出现的32位和64位的冲突问题
    目录1.关于安装Access数据引擎:microsoft.ACE.oledb.16.0(或者:microsoft.ACE.oledb.12.0)2.关于MSSM界面导入,选择目标时候,没有SQLServerNativeClient11.0shanzm-2024年7月31日10:47:241.关于安装Access数据引擎:microsoft.ACE.oledb.16.0(或者:microsoft.ACE.oledb.12.0)公司......
  • 3.哈希表
    哈希表1.引入哈希表又称散列表,一种以「key-value」形式存储数据的数据结构。所谓以「key-value」形式存储数据,是指任意的键值key都唯一对应到内存中的某个位置。只需要输入查找的键值,就可以快速地找到其对应的value。可以把哈希表理解为一种高级的数组,这种数组的下标......
  • swiper navigation和vue本身的路由冲突
    报错问题解释:这个报错通常意味着Swiper(一款广受欢迎的滑块视图插件)的导航(可能是指分页导航按钮)与Vue.js框架中的路由系统发生了冲突。Swiper的导航可能使用了与Vue路由系统相同的事件处理或是DOM结构,导致两者互相干扰,从而产生错误。问题解决方法:检查Swiper的配置,特别......
  • 深入理解HashMap扩容机制(JDK7)
    Hashmap扩容机制说明:该系列分为JDK7和JDK8,当前文章只讲解JDK7,JDK8扩容讲解请移步《深入理解HashMap扩容机制(JDK8)》一、扩容时机网上总结的会有很多,但大多都总结的不够完整或者不够准确。大多数可能只说了满足我下面条件一的情况。扩容必须满足两个条件:存放新值的时候当......