原理讲解参考:
https://blog.csdn.net/zhengwangzw/article/details/104889549
https://segmentfault.com/a/1190000015812438?utm_source=tag-newest
https://www.javadoop.com/post/hashmap#toc_9
put 大致步骤
-
初始化
-
计算下标
-
判断下表第一个元素是否是待处理节点
-
判断是否是树节点
-
遍历链表获取待处理节点
-
处理待处理节点,并判断是否转换为树
-
size++,modCount++, -->resize();
注意点
- 存储元素的table数组第一次初始化是在第一次put
- 链表转换红黑树,需要满足链表长度大于8且元素个数大于64否则不是转换为树,而是扩容
- 计算hash值时,高16位异或低16位,目的是** 混合原始哈希码的高位和低位,以此来加大低位随机性**
1.7与1.8中区别
-
hash函数
1.7 四次异或
1.8 一次异或 -
hash冲突后存储结构
1.7 链表
1.8 链表+红黑树 -
扩容
1.7 对所有元素重新hash
1.8 通过 对hash & oldCap 判断最高位是否为0,确定元素插入原始位置还是原始位置+oldCap -
链表插入
1.7 头插法 即新增元素hash冲突时,插入链表头部
1.8 尾插法 即新增元素hash冲突时,插入链表尾部 -
扩容时机
1.7 插入新元素前扩容
1.8 插入新元素后扩容
网友评论