当前位置: 首页 > news >正文

【java】HashMap的实现原理

目录

          • 1. 说明
          • 2. 哈希函数
          • 3. 桶数组
          • 4. 哈希冲突解决
          • 5. 动态扩容
          • 6. 查找、插入和删除操作

1. 说明
  • 1.HashMap是一个基于哈希表的数据结构,它实现了Map接口。
  • 2.HashMap允许使用null键和null值,并且不保证映射的顺序。
2. 哈希函数
  • 1.HashMap使用哈希函数来计算键的哈希值。
  • 2.在Java中,这通常是通过调用键对象的hashCode()方法来实现的。
  • 3.hashCode()方法返回一个int类型的哈希码,HashMap使用这个哈希码来确定键在内部数组(也称为“桶”数组)中的位置。
3. 桶数组
  • 1.HashMap内部维护了一个Entry数组(或称为“桶”数组),用于存储键值对。
  • 2.每个Entry对象包含一个键、一个值以及指向下一个Entry的引用(用于处理哈希冲突时的链表结构)。
4. 哈希冲突解决
  • 1.当两个或多个键的哈希值相同时,它们会映射到桶数组中的同一个位置,这称为哈希冲突。
  • 2.HashMap通过链表(在Java 8之前)或链表+红黑树(在Java 8及之后)来解决哈希冲突。
  • 3.链表:在Java 8之前,当发生哈希冲突时,新的键值对会被添加到冲突位置上的链表的末尾。
  • 4.链表+红黑树:在Java 8及之后,为了优化性能,当链表长度超过一定阈值(默认为8)时,链表会转化为红黑树。
  • 5.红黑树是一种自平衡的二叉搜索树,它可以在O(log n)的时间内完成查找、插入和删除操作,这比链表的O(n)时间复杂度要好得多。
5. 动态扩容
  • 1.HashMap具有动态扩容的能力。
  • 2.当桶数组中的元素数量超过负载因子(默认为0.75)与数组长度的乘积时,HashMap会进行扩容操作。
  • 3.扩容操作会将数组的长度扩大为原来的两倍(但数组的大小始终是2的幂次方),并重新计算每个键值对在新数组中的位置,然后将它们移动到新数组中。
  • 4.扩容操作是一个相对耗时的过程,因为它需要遍历整个HashMap并重新计算每个键值对的位置。
  • 5.通过动态扩容,HashMap可以保持较高的查找、插入和删除效率,避免因为数组过满而导致的性能下降。
6. 查找、插入和删除操作
  • 1.查找:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到具体的键值对。
  • 2.插入:将键值对封装到Entry对象中,根据键的哈希值找到对应的桶,然后处理哈希冲突(添加到链表末尾或红黑树中)。如果链表长度超过阈值,则进行树化操作。如果元素数量超过阈值,则进行扩容操作。
  • 3.删除:根据键的哈希值找到对应的桶,然后遍历桶中的链表或红黑树来找到要删除的键值对,并将其从链表或红黑树中移除。如果删除后链表长度小于树化阈值的一半(默认为4),则可能将红黑树转化为链表。
http://www.lryc.cn/news/513379.html

相关文章:

  • FCM32F103C8T6开发指引
  • Python世界:人生苦短,我用Python
  • 【从零开始入门unity游戏开发之——C#篇43】C#补充知识——值类型和引用类型汇总补充、变量的生命周期与性能优化、值类型和引用类型组合使用
  • 从论文到实践:Stable Diffusion模型一键生成高质量AI绘画
  • 项目管理:用甘特图 “导航” 项目全程
  • v3.0.8- 「S+会员」新增专属运动秀,试试新穿搭吧- 与「好友」
  • 9-Gin 中自定义 Model --[Gin 框架入门精讲与实战案例]
  • 【VBA】EXCEL - VBA 创建 Sheet 表的 6 种方法,以及注意事项
  • 数据库中,group by 和partition by:数据分组和数据分区的区别
  • 【linux学习指南】Ext系列文件系统(四)路径分区链接
  • 深度学习中的参数初始化
  • wpf 基于Behavior库 的行为模块
  • 【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
  • 【SpringMVC】REST 风格
  • IDEA修改编译版本
  • SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误
  • canvas+fabric实现时间刻度尺(一)
  • 傲雷亮相2024中国时尚体育季(珠海站),展现户外移动照明风采
  • YOLOv10-1.1部分代码阅读笔记-block.py
  • @RestControllerAdvice注解
  • Enum枚举类与静态变量和静态数组的区别
  • uniapp——微信小程序读取bin文件,解析文件的数据内容(三)
  • SpringBoot集成ECDH密钥交换
  • python文件操作相关(excel)
  • 探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程
  • 【面试系列】深入浅出 Spring Boot
  • @colyseus/social 模块详解
  • 石岩路边理发好去处
  • ROS 2中的DDS中间件
  • 「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计