- 讲下对HashMap的认识
- HashMap的初始化默认参数
- HashMap的扩容机制
- HashMap 在 JDK1.8 中扩容 resize( ) 方法扩容流程(和之前版本的区别)
- HashMap为什么在JDK1.8为添加了红黑树的数据结构
- 链表升级成红黑树的条件
- 红黑树退化成链表的条件
- 为什么Hashmap的长度必须是2的n次幂
- HashMap获取的hash值的方法(HashMap可以存key为null的主键吗)
- HashMap 为什么在获取 hash 值时要进行位运算
- HaspMap的初始化时数组长度和加载因子的约束范围
- JDK1.8之前HashMap采用头插法插入元素的隐患
- HashMap 的 get 方法的流程分析
- HashMap 的 put 方法的流程分析
- HashMap 在扩容时为什么通过位运算 (e.hash & oldCap) 得到新数组下标
HashMap基础篇
1、讲下对HashMap的认识
HashMap存储的是键值对 key - value,key具有唯一性,是哈希表数据结构在 Java 中的经典体现,采用了链地址法来处理哈希冲突。
- HashMap底层的数据结构在 JDK1.8 中有了较大的变化,1.8之前采用数组加链表的数据结构,1.8采用数组加链表加红黑树的数据结构。 - HashMap为什么在JDK1.8为添加了红黑树的数据结构
- 1.8之前采用头插法插入 key - value,1.8采用尾插法。 - JDK1.8之前HashMap采用头插法插入元素的隐患
- HashMap 是线程不安全的,类似的线程安全的集合有 HashTable 和 ConcurrentHashMap 。 - HashMap 和 HashTable 的比较、 - HashMap 和 ConcurrentHashMap 之间的对比
- 在 1.8 版本的中 resize( ) 方法也有了很大的改变,提升了扩容性能。 - HashMap 在 JDK1.8 中的扩容流程(源码分析)
2、HashMap的初始化默认参数
- HashMap的加载因子默认是0.75,Node数组 (桶) 的初始长度为16。
- 在 HashMap 初始化时可以设置初始长度和加载因子 - HaspMap的初始化时数组长度和加载因子的约束范围,但是数组长度必须满足 2 的 n 次幂(不满足也能初始化成功) - 为什么Hashmap的长度必须是2的n次幂。
- 临界值 threshold = 加载因子 * 数组长度,默认初始的时候是 16 * 0.75 = 12。
- 源码中的一些默认参数如下:
//HashMap的默认初始长度16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//HashMap的最大长度2的30次幂
static final int MAXIMUM_CAPACITY = 1 << 30;
//HashMap的默认加载因子0.75