HashMap 的底层实现

news2025/1/6 18:03:43

一、数据结构

HashMap的底层主要基于数组和链表(或红黑树)实现。数组用于存储桶(bucket),每个桶可以包含一个链表或红黑树(在JDK 1.8及之后版本中),用于解决哈希冲突。

二、哈希函数与哈希值

每个键都会通过哈希函数计算出一个哈希值,然后通过哈希值决定数据应该存储在哪个桶中。哈希函数的主要目的是将数据均匀地分布在不同的桶中,从而减少哈希碰撞(即两个不同的键映射到同一个桶中的情况)。

三、put方法实现

put方法用于将键值对插入到HashMap中。其实现过程如下:

  1. 首先,通过键的hashCode()方法计算键的哈希值。
  2. 使用哈希算法将哈希值转换为数组的下标,定位到具体的桶。
  3. 如果桶为空,则直接在桶中插入新节点。
  4. 如果桶不为空,则遍历链表或红黑树,查找键是否已存在。
    • 如果键已存在,则替换对应的值。
    • 如果键不存在,则将新节点插入到链表的末尾(在JDK 1.8及之后版本中),并根据链表长度是否达到阈值(默认为8)来决定是否将链表转化为红黑树。
  5. 更新修改次数和元素数量,并进行必要的操作,如检查是否需要扩容。

四、get方法实现

get方法用于根据键来获取值。其实现过程如下:

  1. 首先,传入要查找的键,并通过hash(key)方法计算键的哈希值。
  2. 使用哈希值确定键在HashMap中的桶位置。
  3. 在确定的桶位置找到对应的链表或红黑树,并遍历它。
    • 如果桶为空,则返回null,表示没有找到对应的值。
    • 如果桶不为空,则使用键的equals()方法来比较传入的键和当前节点的键是否相等。
    • 如果找到了相等的键,则返回对应节点的值。
    • 如果遍历完整个链表或红黑树仍然没有找到相等的键,则返回null,表示没有找到对应的值。

五、扩容机制

当HashMap中的元素数量超过阈值(默认为数组容量的75%)时,会自动触发扩容操作。扩容过程如下:

  1. 创建一个新的数组,容量是原来的两倍。
  2. 重新计算每个键的哈希值和索引位置。
  3. 将键值对重新插入到新的数组中。

在扩容过程中,会根据哈希码的高位来确定键值对是保留在原来的位置还是移动到新的位置。

六、其他特性

  1. 允许null键和null值:HashMap允许存储null键和null值,但null键只能有一个。
  2. 线程不安全:HashMap在默认情况下是非线程安全的。多个线程同时对HashMap进行插入、删除或查找操作可能会导致不一致的结果。在并发环境下,应考虑使用线程安全的ConcurrentHashMap或使用适当的同步机制来保护HashMap的访问。
  3. 负载因子:负载因子是HashMap在扩容之前允许的平均桶占用比例,默认为0.75。负载因子较小可以减少哈希冲突的概率,但会增加空间占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件,这些组件可以组合成独特的解决方案。在选择密钥管理系统(KMS)时,您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项,在项目实施中,往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备,作为前端无线信号的覆盖。在具体安装无线AP过程中,我们必须要注意以下几点才能保证项目实施完…

【动手学电机驱动】STM32-MBD(2)将 Simulink 模型部署到 STM32G431 开发板

STM32-MBD(1)安装 STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署 【动手学电机驱动】STM32-MBD(2)Simulink 模型部署 1. 软硬件条件和环境测试1.1 软硬件条件1.2 开发环境测试 2. 创建基于 STM32 处理器…

adb 不是内部或外部命令,也不是可运行的程序或批处理文件。

1、问题概述? 本文讲述的是在window系统中安装了Android SDK之后,adb无法使用的情况。 在cmd中执行adb devices提示如下问题: adb 不是内部或外部命令,也不是可运行的程序或批处理文件。 问题:没有配置android sdk环…

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记(一)开发环境搭建 OpenHarmony(鸿蒙南向开发)——标准系统移植指南(一) OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二&…

拟声 0.60.0 | 拟态风格音乐播放器,支持B站音乐免费播放

「拟声」是一款音乐播放器,不仅支持音视频的本地播放,还提供了账号注册功能,登录后可享受自动同步歌单、歌词等。它支持播放绝大多数音频格式,具备固定输出采样率、独占输出、内置均衡器和音调调整等功能。同时,它也支…

word文档中的文档网格——解决相同行间距当显示出不同行间距的情况

1 问题 被一个行间距调疯了,就是样式改了没用,格式刷刷了没用。就是肉眼可以看出行间距完全不一样。 2 解决方法 1)修改论文正文(即出现问题文本的样式)样式:样式>修改>格式>段落>缩进和间距>取消"如果定义了…

linux nginx maccms管理后台无法进入页面不存在和验证码不显示的问题

windows中运行maccms非常顺利,轻松搭建了。并一切正常。而我在linux中搭建缺遇到了一个非常奇怪的问题。进入管理后台,明明"admin.php"(比如重命名成a.php)的页面是存在的,访问时缺提示页面不存在!稍后就自动跳到首页了…

简单使用linux

1.1 Linux的组成 Linux 内核:内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统,如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…

pikachu靶场--目录遍历和敏感信息泄露

pikachu靶场—目录遍历和敏感信息泄露 目录遍历 概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再…

MyBatis-plus sql拦截器

因为业务需求,重新写了一套数据权限。项目中用的是mybtis-plus,正好MyBatis-Plus提供了插件数据权限插件 | MyBatis-Plus,那就根据文档来实现这个需求。 实现: 实现MultiDataPermissionHandler 首先创建MultiDataPermissionHan…

硬件-射频-PCB-常见天线分类-ESP32实例

文章目录 一:常见天线1.1 PCB天线①蓝牙模块的蛇形走线-天线②倒F天线-IFA:③蛇形倒F天线-MIFA④立体的倒F天线-PIFA 1.2 实例示意图1.21 对数周期天线(LPDA):1.22 2.4GHZ的八木天线:1.23 陶瓷天线:1.24 外接天线: 二&…

Gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置

gitlab-runner 修改默认的builds_dir并使用custom_build_dir配置 1. 说明2. 实操(以docker执行器为例)2.1 修改默认的builds_dir2.1.1 调整gitlab-runner的配置文件2.1.2 CI文件 2.2 启用custom_build_dir2.2.1 调整gitlab-runner的配置文件2.2.2 CI文件…

WPF+Prism View与ViewModel绑定

1、开发环境,Win10VS2022.NET8Prism.DryIoc(9.0.537)或Prism.Unity。 2、通过NuGet安装Prism.DryIoc(9.0.537)或Prism.Unity。 2.1、创建ViewModels文件夹用于存放ViewModel文件、创建Views文件夹存放View文件。 将…

av1学习笔记(一):码流的整体框架

av1学习笔记(一):码流的整体框架 目录 av1学习笔记(一):码流的整体框架1. 码流结构分析:2. OBU信息分析2.1 obu_header2.2 obu_size2.3 drop_obu2.4 sequence_header_obu2.5 temporal_delimiter…

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数 I2C(一):存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MySQL秘籍之索引与查询优化实战指南

MySQL秘籍之索引与查询优化实战指南 目录 MySQL秘籍之索引与查询优化实战指南相关阅读索引相关EXPLAIN 版本 1. 初级篇1.1 【练体术】基础1.1.1 库操作1.1.1 表操作创建一个表增加表字段 1.1.2 增删改插入一条数据删除一条数据更新一条数据库 1.1.3 查询查询所有数据条件查询&a…

MySQL8.0复制原理和部署配置步骤

1. mysql 主从复制原理 在从库上执行change master to;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作;io_thread通过master.info文件中主库的连接信息去连接主库;连接成…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下,视频联网平…