美文网首页
jdk1.7与jdk1.8中HashMap实现的区别

jdk1.7与jdk1.8中HashMap实现的区别

作者: 森林中大鸟 | 来源:发表于2020-05-18 06:02 被阅读0次

原理讲解参考:
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 大致步骤

  1. 初始化

  2. 计算下标

  3. 判断下表第一个元素是否是待处理节点

  4. 判断是否是树节点

  5. 遍历链表获取待处理节点

  6. 处理待处理节点,并判断是否转换为树

  7. size++,modCount++, -->resize();

注意点

  1. 存储元素的table数组第一次初始化是在第一次put
  2. 链表转换红黑树,需要满足链表长度大于8且元素个数大于64否则不是转换为树,而是扩容
  3. 计算hash值时,高16位异或低16位,目的是** 混合原始哈希码的高位和低位,以此来加大低位随机性**

1.7与1.8中区别

  1. hash函数
    1.7 四次异或
    1.8 一次异或

  2. hash冲突后存储结构
    1.7 链表
    1.8 链表+红黑树

  3. 扩容
    1.7 对所有元素重新hash
    1.8 通过 对hash & oldCap 判断最高位是否为0,确定元素插入原始位置还是原始位置+oldCap

  4. 链表插入
    1.7 头插法 即新增元素hash冲突时,插入链表头部
    1.8 尾插法 即新增元素hash冲突时,插入链表尾部

  5. 扩容时机
    1.7 插入新元素前扩容
    1.8 插入新元素后扩容

相关文章

网友评论

      本文标题:jdk1.7与jdk1.8中HashMap实现的区别

      本文链接:https://www.haomeiwen.com/subject/icjyohtx.html