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

浙公网安备 33010602011771号