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 方法执行逻辑的图:

  • 相关阅读:
    37 web自动化实战三 前置后置条件 (fixture yield知识点 conftest.py )
    36 web自动化实战二 pytest用例筛选 断言 生成测试报告 数据驱动
    35 web自动化 pytest框架详述
    性能测试jmeter 监控技术
    性能测试jmeter-接口实战2 函数助手 (随机生成手机号,压测手机号等数据库校验不能重复的接口)
    性能测试jmeter-接口实战1 项目中的关联
    性能测试值jmeter 的基本使用(关联 )
    34 selenium JS操作 文件上传 项目分析
    D. Road to Post Office 解析(思維)
    C. Bank Hacking 解析(思維)
  • 原文地址:https://www.cnblogs.com/zwh0910/p/14354314.html
Copyright © 2011-2022 走看看