HashMap底层原理

server/2024/12/23 5:59:44/

HashMap的底层数据结构

在JDK8之前,HashMap采取的数据结构是数组+链表,在JDK8之后,引入红黑树。

HashMap的核心是一个动态数组,数组上的每个元素也被称为桶,而桶的索引是通过对键的哈希值进行哈希函数处理得到的。若通过哈希函数处理得到的索引相同,则会产生所谓的哈希冲突,就会在原索引后插入该元素,形成链表。若链表过长,则会影响查找效率,时间复杂度为O(n),若数组长度大于64,且链表长度大于8,则会转换成红黑树,将时间复杂度降为O(logn)。数组的初始容量为16,当他超过阈值时会进行两倍扩容,这个阈值为原大小*负载因子,默认为0.75 。

值得注意的是JDK8之前采用头插法会存在死循环问题,需要加锁影响性能,JDK8之后采用尾插法就解决了这个问题

{在存储元素时,如果发生哈希冲突(即多个元素计算出的哈希值对应的数组索引相同),这些元素会以链表的形式存储在该索引位置。但链表中的元素数量并不计入初始容量或影响扩容的判断。}

HashMap的put流程

  1. 通过hash方法计算key哈希值

  2. 数组为空,第一次扩容

  3. 根据哈希值计算key在数组中的下标

    • 若对应下标没有数据,直接插入

    • 若对应下标有数据,判断是否相同key,是则覆盖value,否则需要判断是否为树节点,是则插入节点,否则尾插法入链表,插入后链表长度大于等于8,则转化为红黑树。

  4. 所有元素处理完,还需判断是否超过阈值,超过就扩容。

  • 只重写 equals 没重写 hashcode,map put 的时候会发生什么?

如果只重写 equals 方法,没有重写 hashcode 方法,那么会导致 equals 相等的两个对象,hashcode 不相等,这样的话,这两个对象会被放到不同的桶中,这样就会导致 get 的时候,找不到对应的值。

HashSet底层原理

其实就是HashMap,固定一个不可变的Object对象,通过键操作


http://www.ppmy.cn/server/127990.html

相关文章

【数学二】一元函数微分学-导数的计算-复合函数的求导法则、反函数求导法则、隐函数求导法则

考试要求 1、理解导数和微分的概念,理解导数与微分的关系,理解导数的几何意义,会求平面曲线的切线方程和法线方程,了解导数的物理意义,会用导数描述一些物理量,理解函数的可导性与连续性之间的关系. 2、掌握导数的四则…

【QT Quick】C++交互:调用QML函数

在本节中,我们将深入探讨如何在C中调用QML函数。这项功能非常常用,尤其是在需要将C逻辑与QML界面进行交互时。我们将重点关注invokeMethod函数,它支持多种参数形式,并允许我们灵活地处理不同的调用场景。 invokeMethod概述 invo…

【Vue】vue2项目打包后部署刷新404,配置publicPath ./ 不生效问题

Vue Router mode,为 history 无效,建议使用默认值 hash;

强化学习笔记之【Q-learning算法和DQN算法】

强化学习笔记(一)——Q-learning和DQN算法核心公式 文章目录 强化学习笔记(一)——Q-learning和DQN算法核心公式前言:Q-learning算法DQN算法 前言: 强化学习领域,繁冗复杂的大段代码里面&#…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) ,f(m)指代至少有m个位置不合法的方案数。 怎么求? 注意到位置为id,权值为v ,不合法的情况,当且仅当 v idk或 v id-k 因此,我们把每一个位置和权值抽象成点 ,不合法的情况之间连一…

Spring IoC笔记

目录 1.什么是 IoC? 2.IoC类注解(五大注解) 2.1那为什么要这么多类注解? 2.2五大注解是不是可以混用? 2.3程序被spring管理的条件是? 3.bean对象 3.1Bean 命名约定 3.2获取bean对象 4.⽅法注解 B…

STM32 OLED

文章目录 前言一、OLED是什么?二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…