HashMap类主要用来处理具有键值对特征的数据,随着JDK版本的更新,JDK1.8对HashMap底层也进行了优化
1、 HashMap是基于哈希表对Map接口的实现,HashMap具有较快的访问速度,但遍历顺序却是不确定的。
2、HashMap 提供所有可选的映射操作,并允许使用null值和null键 new HashMap<>().put(null,null)
3、HashMap是线程不安全的,当存在多个线程同时写入HashMap时,可能会导致数据的不一致。
1、loadFactor称为负载因子,默认值为0.75
2、threshold表示所能容纳的键值对的临界值,threshold计算公式为数组长度 * 负载因子
3、size是HashMap中实际存在的键值对数量
4、modCount字段用来记录HashMap内部结构发生变化的次数
5、HashMap的默认容量INITIAL_CAPACITY为16
HashMap采用了数组+链表+红黑树(jdk1.8)的存储结构
HashMap数组部分称为哈希桶,当链表长度大于等于8时,链表数据将以红黑树的形式进行存储,当长度降到6时,转为链表 (链表的时间复杂度为O(n),红黑树的时间复杂度为O(log n))。
每个Node节点存储着用来定位数据索引位置的hash值,K键,V值以及指向链表下一个节点的Node<K,V> next节点组成。Node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对
当向HashMap中插入数据时,首先要确定在哈希桶数组中的位置,那么如何确定node的存储位置呢?
HashMap首先调用hashCode()方法,获取键key的hashCode值,然后对其进行高位运算
将其右移16位,获取高16位,与原低16位进行异或运算
最后将得到的h值与(table.length -1)进行与运算获得该对象的保留位以计算下标