单线程下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 @ 2022-04-17 11:12  开源遗迹  阅读(46)  评论(0)    收藏  举报