HashMap的put方法流程?
1.判断
数组是否是空或null,若为空则调用
resize
进行初始化;
2.根据
key
的值计算
hash
值,找到该元素在数组中存储的下标;
3.
如果没有哈希冲突直接放在对应的数组下标里;如果冲突了,且 key
已经存在,就覆盖掉
value
;
4.如果冲突后,发现该节点是红黑树,就直接在树中插入;
5.遍历数组,判断链表长度是否大于
8
,如果大于
8
并且数组的容量大于
64
,则将链表转换为红黑树,在红黑树中执行插入操作;否则进行链表的插入操作,遍历过程中若发现key值存在直接覆盖掉value即可。
6.插入成功后,判断实际存在的键值对个数是否超过最大容量,若超过则进行扩容。
HashMap的扩容操作是怎么实现的?
1.hashMap中的键值对大于阈值时或者初始化时,就调用resize方法进行扩容;
2.每次扩容的时候都是扩容2倍
3.扩容后重新进行hash分配,该元素要么在原始位置,要么在原始位置+增加的数组大小这个位置。
HashMap怎样解决哈希冲突的?
1.使用链地址法(散列表)来链接拥有相同hash值的数据
2.使用两次扰动函数使数据分布更加平均,降低哈希冲突的概率
3.引入红黑树降低遍历的时间复杂度,加快遍历的速度