• 当添加一个键值对元素时,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()方法,按原数组的长度,扩容一倍。

  • 相关阅读:
    SPI配置
    RabbitMQ部署指南
    期权交易保证金比例一般是多少?
    (总目录)springboot - 实现zip文件上传并对zip文件解压, 包含上传oss
    探索React Router:实现动态二级路由
    golang初始化数据库(MySQL)
    离线安装ceph集群(ceph-13.2.10)
    jenkins流水线实现xjar加固
    【动态规划】64. 最小路径和
    代码与细节(一)
  • 原文地址:https://blog.csdn.net/qq_17845335/article/details/126321832