HashMap如何解决哈希冲突的

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.niftyadmin.cn/n/5680612.html

相关文章

Android常用C++特性之std::sort

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。 std::sort 是 C 标准库中的一个函数,用于对容器或数组中的元素进行排序。它是一个非常高效的排序算法,通常使用快速排序或混合排序&#xff08…

小阿轩yx-案例:Ansible剧本文件实践

小阿轩yx-案例:Ansible剧本文件实践 Playbook 介绍 什么是 playbook playbook 顾名思义,即剧本,现实生活中演员按照剧本表演在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服…

WebAssembly与WebGPU:游戏开发的新时代

文章目录 WebAssembly简介WebGPU简介Wasm WebGPU 在游戏开发中的优势创建一个简单的WebAssembly模块使用WebGPU绘制一个三角形WebAssembly 的高级特性内存管理异步加载与多线程 WebGPU 的高级特性着色器编程计算着色器 实战案例:创建一个简单的 2D 游戏游戏逻辑设计…

无人机之虚拟云台技术篇

一、概念解释 虚拟云台技术,并非直接安装在无人机上的机械装置,而是通过软件算法和传感器技术,模拟出物理云台的功能,实现对相机或传感器的稳定控制。这种技术通过高精度的算法和实时数据处理,能够在无人机飞行过程中&…

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一:让 SQLiteExpert 支持(cipher)加密数据库 SQLiteExpert 作为SQlite 的管理工具,默认不支持加密数据库的,使其成为支持(cipher)加密数据库的管理工具,需要添加e_sqlcipher.dll &…

RabbitMQ 实验入门

使用 spring-amqp 实验 发布订阅模型 fanoutExchange 实验 实验步骤: 编写定义 队列 和 交换机 绑定关系的代码创建接口,模拟生产者,方便调试(接受参数 队列名、路由键、[消息])定义消费者 代码示例: C…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…

Python编码系列—Python责任链模式:打造灵活的请求处理流程

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…