美文网首页
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