zoukankan      html  css  js  c++  java
  • 谈一下hashMap中put是如何实现的?

    源码:

    Hash(key):计算出key的hash值。

    put方法详解:

    1、如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组。数组的长度为n,(put时确保table数组不为空且长度不为0)

    2、如果table数组不为null且数组的长度不为0,则根据table数组的长度n和key的hash值hash(key),计算出数组下标i,该下标对应的节点名称为p,此时p节点为头节点

    如果p节点为null,则根据hash值、key、value新建一个node节点,直接插入。(如果下标位置节点为空,则新建一个节点放在该下标位置)

    其中hash值时key的hashCode()方法算出来的值h的低16位异或高16位算出来的结果,

    3、如果table数组不为null且数组的长度不为0,下标i位置的节点p也不为null

    1)、如果p节点的hash值等于hash(key)且p节点的key等于key,将p节点赋值给e节点,即hash值和key均相同时,新的节点覆盖原来的节点,此时e节点不为空。

    (如果下标位置有节点,节点的hash值与hash(key)相等且key也相等,则将该下标位置的节点赋值给e节点,此时e节点的value值为旧值。后面再将新添加的value覆盖e节点的value)

    2)、如果p节点为红黑树节点,则进行红黑树处理,此时e节点不为空

    3)、如果p节点的hash值等于hash(key)但是key不相等且p节点不为红黑树节点,即p节点为链表节点,如果p的下一个节点为空

    则根据hash值、key、value新建一个节点作为p节点的下一个节点,即直接插入,此时e节点不为空,且e节点为新添加的节点。

    如果链表长度超出8时,则执行红黑树逻辑。

    如果p的下一个节点e不为空且e节点的hash值等于hash(key)但是key不相等,则将e赋值给p节点,指向下一个寻找的节点。如果key相等,后面再用新添加的value覆盖e节点的value

    4、如果e节点不为空且e节点的value值不为空,则将新添加的value覆盖e节点的value

    简述如下:如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组,数组的长度为n;根据table数组的长度n和key的hash值hash(key),计算出数组下标i,如果如果下标处头节点为null,则根据hash值、key、value新建一个node节点,直接插入。如果头节点不为null且为红黑树节点,则进行红黑树处理;如果头节点不为null且头节点的hash值相等且key也相等,则用新的节点覆盖旧的节点;如果头节点的hash值相等但是key不相等且头节点的下一个节点为空时,则根据hash值、key、value新建一个节点作为p节点的下一个节点,即直接插入。如果头节点的下一个节点不为空且hash值相等且key相等时,则用新的节点覆盖旧的节点;如果头节点的下一个节点不为空且hash值相等但key不相等时,指向下一个寻找的节点

    put 方法执行逻辑的图:

  • 相关阅读:
    给我买个糖?
    主题反馈
    Git:初始化项目、创建合并分支、回滚等常用方法总结
    tomcat
    tomcat
    docker
    oracle树形结构层级查询之start with ....connect by prior、level、order by以及sys_connect_by_path之浅谈
    java时间类Date、Calendar及用法
    java如何将html过滤为纯文本
    小记Java时间工具类
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14354314.html
Copyright © 2011-2022 走看看