HashMap的工作原理

HashMap主要是用来处理键值对数据,随着JDK版本的更新,JDK1.8对HashMap的底层也做了一些优化,HashMap是基于哈希表对Map接口的实现类,它的特点是访问数据速度快,并且不是顺序来遍历的,HashMap提供所有的可选的映射操作但是不能保证映射顺序不变并且允许插入空值和空键,HashMap本身并不是线程安全的,当存在多线程同时写入的时候可能会导致数据不一致的情况

1.HashMap中的关键属性

第一个属性loadFactor它是负载因子,默认值是0.75,表示在扩容前HashMap空间填满程度的边界

第二个属性是threshold,它是记录HashMap所能够容纳的键值对的边界,它的计算规则是负载因子乘以数组的长度

第三个属性是size,它用来记录实际存在的键值对的数量

第四个属性叫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在数组中的位置,那如何去确定Node的存储位置呢,我们以Key为e的字符串的对象为例,HashMap首先会调用hashCode()方法获取key的hashCode值为h,然后对h进行一个高位运算,将h右移16位取得h的高16位与原h的低16位进行异或运算,最后得到h的值与(table.length-1进行与运算)得到对象的保留位,最终获取数组的下标,简单理解就是求模取余法,就是用hash值和数组的长度减一,取模,最后得到数组的下标,这样可以保证数组下标不越界,只不过位运算是二进制运算,它的效率更高

喜欢加个关注哦~~~~~~~~~~~~~~~~~~~~~

你可能感兴趣的:(链表,java,哈希算法)