哈希表概述

简介: 哈希表概述

哈希表概述

哈希值

万物都有哈希值

方法hashCode()就是返回一个对象的哈希值;这个方法属于Object类,Object类是万物的父类,所以也就是万物都有哈希值;

hashCode()返回的是int类型的值;

哈希表结构

哈希表的结构是对象数组+链表+二叉树的形式;

对象数组长度为16,元素下标为0-15,每个元素称之为哈希桶,也就是有16个哈希桶;

每个哈希桶的结构是链表加二叉树的形式;

哈希表存取数据

假如有个Object对象要存入哈希表中:

刚开使用**Object.hashCode()**得到一个int值的数据,然后int值%16(除16取余数),得到的值为多少,就存入对象数组对应下标的哈希桶中,并放在链表第一个位置,当又一个对象进入该哈希桶,该对象就放在链表第二个位置,以此类推;

当一个哈希桶中存的对象大于8个时,链表就会自动变为二叉树的存储形式;

当哈希桶中对象个数减少到6个时,二叉树又会变成链表结构;

散列因子

初始时对象数组长度为16;但是当散列因子>=0.75时,对象数组长度会扩容两倍;

散列因子:就是目前存储了对象的哈希桶占目前所有哈希桶的比例,0.75就是指有75%的哈希桶存储了对象;

当扩容到两倍时:下一次就是除以32取余了(如果之前是除16取余)

HashMap存储数据:

HashMap存储的是键值(K V)的数据;

计算出K的哈希值,然后进行取余运算:(n-1) & hash:表示K的哈希值hash除以对象数组长度取余;

当该哈希桶没有数据,就创建一个新节点存入该键值对;

如果哈希桶已经有数据,就拿要存的数据的K和哈希桶里面的K一一比对,如果K一样,就用新的V覆盖旧V并返回旧V,如果K不一样则存存在最后的节点上;

当我们向HashMap中插入一个键值对时,会首先调用键对象的hashCode()方法,得到该键的哈希值。这个哈希值会被用来定位这个键值对在HashMap内部存储的位置。

然后,HashMap会根据得到的哈希值进行模运算,计算出一个数组下标。HashMap内部实际上是使用了一个数组来存放所有的键值对,这个数组的长度默认为16,并且会随着元素的增加而自动扩容。

接下来,根据计算出来的数组下标,我们会找到对应的位置。但是,这并不意味着我们就可以将键值对直接存放在这个位置,因为不同的键可能会产生相同的哈希值,这就会导致多个键值对被存放在同一个位置,这种情况被称为哈希冲突。

 

为了解决哈希冲突的问题,HashMap采用了链表和红黑树两种方式来存储同一下标的多个键值对。当我们插入第一个键值对时,会在对应位置创建一个链表节点,并将键值对存入。当我们继续插入具有相同哈希值的键值对时,会在链表的尾部添加新的节点。当链表的长度超过一定的阈值(默认为8),链表就会转化为红黑树,以提供更高效的查询性能。

当我们需要从HashMap中获取一个键对应的值时,会先计算出键的哈希值,然后根据哈希值找到对应的位置,然后在该位置上的链表或红黑树中查找对应的键值对。

这就是HashMap存储数据的基本流程,通过哈希化的方式,将键映射到一个固定大小的空间内,再通过链表或红黑树的方式来处理哈希冲突,使得HashMap能够在不同的场景下都能提供稳定的性能表现。

需要注意的是,虽然HashMap提供了高效的存取操作,但是它并不是线程安全的。如果在多线程环境下需要使用HashMap,建议使用Collections.synchronizedMap方法将其包装成线程安全的版本,或者使用ConcurrentHashMap等线程安全的数据结构。

HashMap以其高效、灵活的特性,成为了我们在编程过程中最常用的数据结构之一,深入理解其存数据的流程,对于我们更好地利用这一工具,提高程序的性能具有重要意义。

 

相关文章
|
设计模式 算法 安全
一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)
一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)
2873 0
|
人工智能 机器人 Linux
开源的基于RTOnBoot多核异构框架打造的低成本高性能Linux主控加Ethercat主站解决方案,同步周期可稳定达到125微秒
开源的基于RTOnBoot多核异构框架打造的低成本高性能Linux主控加Ethercat主站解决方案,同步周期可稳定达到125微秒
|
机器人 API 定位技术
具身智能干货|ROS2理论与实践系列(二):ROS2通信机制核心
机器人是一种高度复杂的系统性实现,一个完整的机器人应用程序可能由若干功能模块组成,每个功能模块可能又包含若干功能点,在不同功能模块、不同功能点之间需要频繁的进行数据交互。比如以导航中的路径规划模块为例: 路径规划时就需要其他功能模块输入数据,并输出数据以被其他模块调用。 输入的数据有地图服务提供的地图数据、定位模块提供的机器人位姿数据、人机交互模块提供的目标点数据......。 输出的路径信息则被运动控制订阅或是回显在人机交互界面上。 那么这些相对独立的功能模块或功能点之间是如何实现数据交互的呢?在此,我们就需要介绍一下ROS2中的通信机制了。
2998 62
|
传感器 网络协议 物联网
手把手教你在 Windows 环境中搭建 MQTT 服务器
手把手教你在 Windows 环境中搭建 MQTT 服务器
3356 0
|
机器学习/深度学习 算法 计算机视觉
【博士每天一篇文献-算法】Learning without forgetting
本文提出了一种名为"无忘记学习"(Learning without Forgetting, LWF)的算法,它允许在不牺牲原有任务性能的情况下,通过仅使用新任务的数据来训练卷积神经网络以学习新的视觉能力。
443 0
【博士每天一篇文献-算法】Learning without forgetting
|
机器学习/深度学习 边缘计算 运维
机器学习在网络安全中的防护:智能化的安全屏障
机器学习在网络安全中的防护:智能化的安全屏障
732 15
凸优化理论基础3——凸集和凸锥重要例子
凸优化理论基础3——凸集和凸锥重要例子
1300 0
凸优化理论基础3——凸集和凸锥重要例子
|
9天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1867 119
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
|
10天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1423 13