HashMap如何解决哈希冲突的

embedded/2025/2/21 7:04:36/

HashMap通过以下几种方式来解决哈希冲突:

1. 链地址法(Separate Chaining)

        在JDK 7中,HashMap使用链地址法来解决哈希冲突。当两个或多个键通过哈希函数映射到同一个桶(即数组的同一个索引位置)时,这些键值对会被存储在一个链表中。链表中的每个节点都包含一个键值对。以下是具体的步骤:

  • 计算哈希值:首先,会通过键的hashCode()方法计算得到一个哈希值。
  • 确定桶位置:然后,使用哈希值与数组长度的模运算来确定桶的位置。
  • 解决冲突:如果该位置已经有元素存在(即发生了哈希冲突),新的键值对会被添加到链表的末尾。

举例

假设我们有以下键值对要插入到HashMap中:

  • 键值对1:key1 -> value1,假设key1的哈希值是5
  • 键值对2:key2 -> value2,假设key2的哈希值也是5

在JDK 7中,key1key2的哈希值相同,它们会被映射到同一个桶。这个桶将包含一个链表,链表中有两个节点,每个节点分别存储key1 -> value1key2 -> value2

2. 红黑树(JDK 8)

        在JDK 8中,HashMap在链表长度超过一定阈值(默认为8)时,会将链表转换成红黑树。红黑树是一种自平衡的二叉搜索树,可以保证查找、插入和删除的最坏情况时间复杂度为O(log n)。以下是具体的步骤:

  • 链表转树:当链表的长度达到阈值时,HashMap会将链表转换成红黑树。
  • 树操作:插入或查找时,会使用树的操作来确保元素的正确位置。

举例

        继续使用上面的例子,如果HashMap中的链表长度超过了8,那么这个链表会被转换成红黑树。假设我们有以下键值对:

  • 键值对1:key1 -> value1
  • 键值对2:key2 -> value2
  • 键值对9:key9 -> value9

        当第9个键值对插入时,链表会转换成红黑树。此时,key1key2不再存储在链表中,而是作为树节点存储在红黑树中。

总结

    HashMap通过链地址法和红黑树来解决哈希冲突。链地址法简单地将冲突的元素存储在链表中,而红黑树则通过树结构来优化查找性能,尤其是在元素数量较多时。这些方法确保了即使在哈希冲突的情况下,HashMap也能保持较高的性能。


http://www.ppmy.cn/embedded/119046.html

相关文章

Vue入门2

Vue入门2 今天我们分4个部分来讲解Vue的使用 1.计算属性 2.用ref获取dom 3.侦听器的普通写法 4.对象格式的侦听器 注意: 在我们写代码的时候, 还是要引入vue.js文件的, 不然程序不能使用Vue框架, 这个很重要, 千万不能忘记。 vue.js文件就是第一篇Vue文章里面写到的vue.js…

【React】组件基础使用

1. react组件 在react中&#xff0c;组件就是首字母大写的函数&#xff0c;内部存放了组件的逻辑、UI&#xff0c;渲染组件只需要把组件当成标签书写。 使用组件有两种方式&#xff1a;自闭和 、成对标签 function App() {// 定义组件function Component() {return <div&…

力扣(leetcode)每日一题 2207 字符串中最多数目的子序列

题干 2207. 字符串中最多数目的子序列 给你一个下标从 0 开始的字符串 text 和另一个下标从 0 开始且长度为 2 的字符串 pattern &#xff0c;两者都只包含小写英文字母。 你可以在 text 中任意位置插入 一个 字符&#xff0c;这个插入的字符必须是 pattern[0] 或者 pattern…

CentOS 修改服务器登录密码的完整指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

OpenHarmony(鸿蒙南向)——平台驱动开发【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

【Python】Flask-Admin:构建强大、灵活的后台管理界面

在 Web 应用开发中&#xff0c;构建一个直观且功能丰富的后台管理系统对于处理数据和维护应用至关重要。虽然构建一个完全自定义的管理后台界面非常耗时&#xff0c;但 Flask-Admin 提供了一个简洁、灵活的解决方案&#xff0c;可以让开发者快速集成一个功能齐全的后台管理系统…

k8s删除和添加node节点

一、删除node节点 1.首先生成token kubeadm create token --print-join-command 保存打印出的信息&#xff0c;默认有效期为24h kubeadm token list 查看token 2.排空node节点上运行的pod kubectl drain node1 --delete-local-data --force --ignore-daemonsets 3.删除…

Linux云计算 |【第四阶段】RDBMS1-DAY2

主要内容&#xff1a; 常用函数&#xff08;函数分类1&#xff1a;单行、分组&#xff1b;函数分类2&#xff1a;字符、数学、日期、流程控制&#xff09;、分组查询group by、连接查询 一、常用函数 1. 按使用方式分类 ① 单行函数 单行函数&#xff08;Scalar Functions&…