• 当添加一个键值对元素时,HashMap发生了什么?


            Map集合在底层使用数据+链表+红黑树作为存储结构,Map中的每一个元素,都会被封装成一个内部类Entry对象,该对象存有key、value、next、hash。Map底层是一个默认长度为16的数组,在数组中保存Entry对象。所以,每次当我们使用下面这行语句时,都会将key、value存储到Entry对象中,然后将每一个Entry对象都保存在数组中,当发生哈希冲突时,会在发生哈希冲突的数组位置将Entry对象以链表的形式保存,并且当链表长度大于阈值8,数组长度大于64时,会将列表转化为红黑树,减少搜索时间。

    1. Map map = new HashMap();
    2. map.put("", "");

            下面简单介绍一下,当给Map集合中添加一个键值对元素时,HashMap发生了什么。

    ⑴判断Node类型的数组table是否为空,如果为空进行初始化。

    ⑵如果不为空,使用hash方法计算key的hashCode,通过(n-1) & hash计算应当存放在数组中的下标index。

    ⑶查看table是否存在数据。

    ⑷如果没有数据,就构造一个Node节点,存放在table[index]中。

    ⑸如果存在数据,说明发生哈希冲突,继续判断key是否相等。

    ⑹如果相等,用新的value替换原数据。

    ⑺如果不相等,判断当前节点类型是不是TreeNode树型节点。

    ⑻如果是树型节点,创造树型节点插入到红黑树中。

    ⑼如果不是树型节点,创建普通Node加入链表尾部。

    ⑽判断链表长度大于阈值8并且数组长度大于64,如果满足,链表转换为红黑树,如果不满足,数组扩容。

    ⑾最后,插入完成后,判断当前节点数是否大于实际存储空间大小。

    ⑿如果大于,调用resize()方法,按原数组的长度,扩容一倍。

  • 相关阅读:
    【创作活动】作为程序员的那些愚蠢瞬间
    C#教程12:结构
    openvpn部署
    Dubbo retries 超时重试机制的问题
    A股上市公司MSCI指数和ESG评级效果(2010-2021年)
    React报错之Functions are not valid as a React child
    02:项目二:感应开关盖垃圾桶
    力扣刷题篇之数与位1
    集群中增加数据节点与退役数据节点
    Python | 执行shell 命令的几种方法
  • 原文地址:https://blog.csdn.net/qq_17845335/article/details/126321832