HashMap
HashMap实现了Map接口,用于存储K,V键值对的集合类。
主要特征包括:Key可存NULL、无序、线程不安全、 底层使用了数组+链表+红黑树的结构。
特点
在阅读源码基础上,查阅并结合其他文章资料,以介绍+提问的形式,列出HashMap以下常见特点若干项。
-
HashMap存储单元类型。
hashMap内部使用Node类型对象来保存内容。
Node类型中包括hash、key、value、next四部分。 -
HashMap的存储结构。
HashMap的存储结构中使用了Node类型的数组、单链表、和红黑树。
单链表和红黑树是用来处理哈希冲突时的节点存储。 -
HashMap初始容量、最大容量、负载因子、如何扩容。
初始容量:默认为16。
最大容量:为2^30。
指定容量时,使用tableSizeFor方法向上取值,且未2的幂次方,比如:30向上取值为32。
负载因子默认为0.75,扩展因子*容量为扩容阈值,当达到扩容阈值时,容量扩为原来的2倍。 -
HashMap put 插入过程。
简单划分为以下4个过程:-
初始化检查
如果数组为空,则初始化数据。 -
确定插入位置
散列计算确定插入的哈希桶位置,采用Hash值对N取模【 hash & (N-1)】,确定哈希桶的位置。 -
哈希碰撞、处理阶段
如果要插入的哈希桶为空,则直接插入节点。
如果哈希桶有值了,则判断是哈希冲突还是重复插入。
如果是重复插入,则更新插入的值。
如果是哈希冲突,则采取处理哈希冲突的策略,策略包括拉链法和构建红黑树。 -
容量检查、扩容
插入节点后,如果超出了阈值【大小*负载因子】,进行Resize扩容操作。
-