• HahMap(jdk=1.8)源码解读


    简介:岁月磨平了人的棱角,让我们不敢轻易的去放手,即使它在你心中并不那么重要,你依旧害怕失去它,不是舍不得,是内心的迷茫。                

    一 : 创建HashMap

      HashMap<Object, Object> hashMap = new HashMap<>();

    源码1

    解读:初始化this.loadFactor(0.75),改值做为一个负载因子,当负载比数大于它时,就会扩容一倍数组容量( >>1)

    二:插入新值到HashMap中

    hashMap.put(1, 1);
    hashMap.put(2, 1);

    源码2:

    解读:仅计算了key的hash值,然后传递给下面代码

     解读:

    步骤1.第一个IF判断赋值后判断table是否为null --> true {初始化table(resize)和赋值n}

    步骤2.第二个IF(通过数组长度和key的hash值的位运算与&,计算key所在的数组索引->赋值并判断改位置是否位null)?-->true{若为null,说明key不存在,新建node节点并赋值改数组位置}

    步骤3.承接2的第二个IF == false,即该位置存在数据节点p。第三个IF(通过短路与(&&)判断p的hash值和p的key值和参数key是否相等)-->true{说明key已经存在,并赋值e位该节点}

    步骤4.承接3的第三个IF == false, 即该节点P的key不是不参数key。else if (判断该节点P是否位树节点) -->true{是树节点,把新值插入树节点,并返回值赋值给e}

    步骤5.承接4的else if  == false,即该节点是链表节点。然后for迭代链表节点然后判断,第一个IF(判断该节点的下一个节点是否位null)?-->true{新建节点值并赋值给节点} ,紧跟第二个IF(判断迭代的次数是否大于(8-1)即8次)?-->true{说明该链表长度大于8,然后链表转换为红黑树},然后迭代结束。第三个IF,承接第一个IF即该节点不为null,然后步骤3判断一样

    步骤6.IF判断e是否不为null?-->true{旧值返回,并退出}

    步骤7.承接第二步的 IF == true,说明在数组的新的位置插入了新数据,然后IF判断(数组的填充数是否大于数组的长度乘以负载因子)?-->true{扩容数组}

    步骤8.空的方法

    三:获取HashMap中的值

    hashMap.get(1);

     解读:计算key的hash值,并把hash值和key传入getNode方法

     解读:

    步骤1.第一个IF(利用短路与(&&)判断table是否为null和table的长度和位运算与(&)找出hash值对应的数组索引并赋值first判断是否位null)

    步骤2.承接步骤1 if==true,IF(判断key是否相等)?-->true{返回该节点}

    步骤3.承接步骤2 IF == false,第一个IF(赋值并判断为 null),第二个IF(判断该节点是否位树节点)?-->true{通过树查找并返回退出},第三个IF 在do{}while内,承接第二个IF==false,即链表节点,查找并返回退出

    步骤4.返回null,即查找的值不存在

  • 相关阅读:
    vue 首页问题
    springboot redis
    idea spring-boot总结
    mybatis
    springboot mybatis搭建
    spring mybatics
    后面公司里就通过maven从阿里云下载了, idea springboot+adep
    [Java] 解决异常:“The last packet sent successfully to the server was 0 milliseconds ago.
    [Linux] 由管道父进程向子进程发送数据 (父子间IPC)
    [Linux] 进程间通信--管道 pipe 函数详解 (出自 360百科)
  • 原文地址:https://www.cnblogs.com/jinliang374003909/p/13493659.html
Copyright © 2020-2023  润新知