zoukankan      html  css  js  c++  java
  • java8 hashMap 源码解读

    HashMap map =  new HashMap<>();
            map.put(1,1);
            map.put(1,2);
            map.put(17,1);

    比如我们使用初始化构造方法的时候没有创建对象,只不过传递一个基础的 扩容因子

    DEFAULT_LOAD_FACTOR
    public HashMap() {
            this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
        }

     如果一个存放一个key,value的hash结构需要存放那些值,key,value,hash,next结点如下图

    tab[i] = newNode(hash, key, value, null);

    这是初始化,如果第一次put

     if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;

     resize这个方法注释就是初始化和扩容第一次返回一个默认长度16的数组

    并且赋值

    第二次的时候会判断时候hash冲突,如果hash冲突,则判断值时候相同。如果相同则覆盖,如果不同着看时候时候树化

    如果没有则判断链表长度时候超过7,判断是否需要树化的条件为链表超过8并且数组长度超过64

    然后讲解一下 resize ,初始化和扩容,扩容涉及数据迁移,怎么迁移

    使用到的方法原始的hash值&原始的数组长度如:

    这就是为什么初始长度为16的原因

    01001&10000=0但是11001&10000=1

    do {
                                next = e.next;
                                if ((e.hash & oldCap) == 0) {
    这里就没有在rehash了,这样又加快了速度
    这是使用的是尾插法
    讲解,1.7和1.8扩容机制,1.7最用的是头插,而已1.8用的是尾插
    1.7会造成死循环
    假设有两个线程
    这个map需要扩容的时候两个线程同时使用,然后都需要扩容
    假设一条链表为node1,node2
    如果第一个线程扩容完成则为node2,node1然后一条线程过来了
    执行到node1,node2 这样的话就形成了死循环



  • 相关阅读:
    JQuery.Gantt(甘特图)开发
    文件上传利器SWFUpload入门简易教程
    ES6:JavaScript 新特性
    记一次关于垃圾回收app的推广成功案例
    c#游戏之路-wpf版本开发
    C#游戏之路-winform,wpf,directx,opengl的了解
    Python3 引号
    while循环练习
    用jquery实现瀑布流(方式1-固定宽度和列数,按顺序添加图片)
    jquery实现图片轮播淡入淡出效果
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/15091166.html
Copyright © 2011-2022 走看看