单线程下HashMap工作原理
HashMap主要是用来处理键值对数据,随着jdk版本的更新,jdk1.8底层也对HashMap做了一些优化
HashMap是基于哈希表对Map接口的实现类,
他的特点呢是访问速度快,并且不是按顺序来遍历,
HashMap提供所有的可选的映射操作,但不能保证映射顺序不变,
并且允许插入空值和空键,
HashMap本身并不是线程安全的,
当存在多线程同时写入的时候,可能会导致数据不一致的情况
1.HashMap中的关键属性
loadFactor,他是负载因子,默认值是0.75,,表示在扩容前,HashMap空间填满程度的边界
threshold,他是记录HashMap所能够容纳的键值对边界,他的计算规则 是负载因子*数组的长度
size,它用来记录HashMap实际存在的键值对的数量,
modCount,它用来记录HashMap内部结构发生变化的次数,
还有一个常量属性DEFAULT_INITIAL_CAPACITY,它是HashMap的容量值,默认是16
2.HashMap的存储结构
HashMap采用的是 数组 + 链表 + 红黑树(jdk1.8)+的一个存储结构
HashMap的数组部分称为Hash桶,数组元素保持在一个叫做table的属性中,
当链表长度大于8时候,链表的数据将会以红黑树的形式存储,当链表长度降到6时候,为链表的形式进行存储,
每个Node节点保证了用来定位数组的索引位置的hash值和key,value以及链表指向的下一个Node节点,
Node类又是HashMap的内部类,它实现了Map.Entry接口,它的本质其实可以简单地理解成一个键值对
3.HashMap的工作原理
当我们向HashMap中插入数据时,首先要确定Node在数组中的位置,
利用求模取余法(h=hashCode%(table.length-1)),就是用hash值和数组的长度减一,取模,最后得到数组下标,这样可以保证数组下标不越界,只不过位运算是二进制运算,他的效率更高。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报