java8 HashMap分析
hashMap在Map集合中拥有无法替代的地位,工作中经常用到,hashMap也是面试必问,今天来学习一下
主要了解
- hashMap原理内部结构
- hashMap 中hashMap函数实现
- hashMap扩容机制
- hashMap put源码实现
- 如何解决hash冲突
hashMap原理内部实现
java7 之前是采用数组+链表,但是在java8之后是:数值+链表+红黑树:
1.数组初始值为16,负载因子0.75,当数组长度超过16*0.75时,就会扩容
2.hash冲突时,就会在当前节点产生下一个节点,形成一个链表,链表的默认最大长度为8,当超过8时,链表就换转换成红黑树
3.当调用put方法时,首先会通过hash(key)得到hashCode值,为尽量保证hash值唯一,采用高16位和低16进行异或运算(使用异或运算更接近底层,提高效率
putVal方法内部逻辑4中情况
1.首先要初始化一个数组
2.计算数组下表,判断是hash存在冲突,没有冲突则把Node放在下标中
3.hash冲突,则存在3中情况
(1)当key相同,则把原来的Node覆盖掉
(2)当前冲突的节点就已经是红黑色(TreeNode)结构,则向红黑树中添加一个叶子节点
(3)当前节点是链表,则向链表添加一个节点,链表长度加1,如果链表长度大于等于8,则转换成红黑树
扩容
resize()方法实现初始化,和扩容功能
采用2倍扩容,数组的大小必须是2的n次幂,保证结果的分散性,判断当前容量是否大于2的30次方,以及扩容后是否大于2的30次方,没有大于则创建一个新的数组重新赋值(这个值只可能出现在两个地方,一个是原下表位置,另一个是原先标+容量的位置)到新的数组并返回
解决hash冲突
开放定址
链地址法