单线程下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值和数组的长度减一,取模,最后得到数组下标,这样可以保证数组下标不越界,只不过位运算是二进制运算,他的效率更高。

 

posted @   开源遗迹  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示