当前位置: 首页 > news >正文

Java,数据结构与集合源码,关于Map接口的实现类(HashMap、LinkedHashMap)

HashMap中的元素的特点:

HashMap中的所有key之间是不可重复的、无序的。所有的key构成一个Set集合。
HashMap中的所有的value彼此之间是可重复的、无序的。所有的value构成一个Collection集合。
HashMap中的一对key-value,就构成了一个entry。Map中的entry是不可重复的、无序的。所有的entry就构成了一个Set集合。

HashMap的源码剖析:

jdk7:

HashMap < String , Integer > map = new HashMap<>(); //①
map.put("AA",78);//②
①:创建对象的过程中,底层会初始化数组,长度为16,即:Entry[ ] table = new Entry[16];
②:“AA”和78封装到一个Entry对象中,将此对象添加到table数组中。

添加的过程:

将(key1,value1)添加到当前map中:
首先,需要调用key1所在类的hashCode( )方法,计算key1对应的哈希值1,此哈希值1经过某种算法(hash( ))之后,得到哈希值2。
哈希值2再经过某种算法(indexFor( ))之后,就确定了其在数组table的索引位置i。
        ·如果此索引位置i的数组位置上没有元素,则(key1,value1)添加成功。——情况①
        ·如果此索引位置i的数组位置上有元素(若为key2),则需要继续比较key1和key2的哈希值2。-->哈希冲突。
                    ·如果key1的哈希值与key2的哈希值不相同,则(key1,value1)也添加成功。——情况②
· 如果key1的哈希值与key2的哈希值相同,则需要则需要继续判断key1和key2的equals( )的返回值。要调用key1所在类的equals( )方法,将key2作为参数传入。
                                    ·如果调用equals( )方法,返回false:则(key1,value1)添加成功。——情况③
                                    ·如果调用equals( )方法,返回true:则认为key1和key2是相同的。默认情况下,value1替换原有的value2.

添加成功的情况:

情况①:直接将(key1,value1)存放到数组的索引i的位置
情况②与情况③:(key1,value1)元素与现有的(key2,value2)构成单向链表结构,(key1,value1)指向(key2,value2),jdk7中即头插法。

如果满足以下情况,会扩容:

当元素的个数达到临界值(数组长度*加载因子)时,就考虑扩容。默认的加载因子为0.75。默认扩容后为原来的两倍。
如果put方法是添加操作,会返回null。如果put是修改操作,会返回原来位置上的value值。

jdk8中:

①在jdk8中,当创建了HashMap实例以后,底层并没有初始化table数组。当首次添加(key,value)时,进行判断,如果发现table尚未初始化,则对数组进行初始化。(懒汉式)
②在jdk8中,HashMap底层定义了Node内部类(实现了Entry接口),替换了jdk7中的Entry内部类。即创建的数组是Node[ ]。
③在jdk8中,出现哈希值冲突的情况,判断相应的(key,value)可以添加到指定发生哈希冲突的索引上,采用的是原来的元素指向新的元素,即尾插法。
④在jdk7中,底层采用的是数组+单向链表。在jdk8中,底层采用的是数组+单向链表+红黑树。
使用红黑树的情况(单向链表转换为红黑树):如果数组索引i上的元素的个数达到8,并且数组的长度达到64时,就将此索引i位置上的多个元素改为使用红黑树进行存储。(红黑树进行put( )/get( )/remove( )等操作的时间复杂度为O(log n)),比单向链表的复杂度O(n)的要更好,性能更高。
红黑树退化(单向链表转换为单向链表)的情况:当使用红黑树的索引i上的元素个数低于6时,就会将红黑树结构退化为单向链表。

LinkedHashMap与HashMap的关系:

LinkedHashMap是HashMap的子类。
LinkedHashMap在HashMap使用数组+单向链表+红黑树的基础上,增加了一对双向链表,记录添加(key,value)的先后顺序。便于遍历所有的key-value。

HashSet和LinkedHashSet:

Hash底层使用的是HashMap。
LinkedHashSet底层使用的是LinkedHashMap。
HashSet的元素的值存储在底层的HashMap的key值中,而所有的key值对应的value值都是同一个Object对象,HashSet里用不上其value值。LinkedHashSet同理。

相关文章:

Java,数据结构与集合源码,关于Map接口的实现类(HashMap、LinkedHashMap)

HashMap中的元素的特点&#xff1a; HashMap中的所有key之间是不可重复的、无序的。所有的key构成一个Set集合。 HashMap中的所有的value彼此之间是可重复的、无序的。所有的value构成一个Collection集合。 HashMap中的一对key-value&#xff0c;就构成了一个entry。Map中的ent…...

【GUI】-- 13 贪吃蛇小游戏之食物及成绩判断

GUI编程 04 贪吃蛇小游戏 4.4 第四步&#xff1a;食物及成绩判断 首先&#xff0c;添加食物与分数的数据定义&#xff1a; //食物的坐标int foodX;int foodY;Random random new Random();//积分面板数据结构int score;在初始化方法中&#xff0c;添加(画出)食物与分数&…...

洗地机哪个牌子好用?洗地机选购攻略

传统的清洁方式都是扫把拖把的结合&#xff0c;既繁琐也劳累&#xff0c;每次清洁完后还得累的腰酸背痛的&#xff0c;像厨房这种地方甚至会不容易清洁干净&#xff0c;总感觉地板灰蒙蒙的。洗地机的诞生就很好的解决了这些问题&#xff0c;不用一遍遍的重复扫地拖地擦地&#…...

节能灯和led灯哪个更护眼?精选高品质的LED护眼台灯

节能灯和LED灯相比&#xff0c;我认为LED灯会更加护眼一些&#xff0c;不过想要更护眼建议选择LED的护眼台灯会更好&#xff01; 大家都知道光亮对于我们来说是非常重要的&#xff0c;尤其是夜晚的时候&#xff0c;往往要借助一些灯具来提供充足的照明。对于孩子而言&#xff0…...

大数据管家 DataSophon 1.2介绍

DataSophon 1.2...

vue实现爱心形状的复选框

目录 HTML代码&#xff1a; CSS代码&#xff1a; Vue代码&#xff1a; 这个例子使用了CSS来创建一个爱心形状的复选框&#xff0c;并使用Vue来控制其选中状态。点击复选框时&#xff0c;将调用toggleChecked方法来切换checked属性的值&#xff0c;以控制复选框的状态。 以下…...

珠江啤酒坚持创新,“酿”造电子化采购平台

珠江啤酒 广州珠江啤酒股份有限公司&#xff08;简称“珠江啤酒”&#xff09;是一家以啤酒酿造产业和啤酒文化产业“双主业”协同发展、包装产业配套发展的大型现代化国有控股企业。2010年&#xff0c;在深交所上市&#xff0c;下属企业16家&#xff0c;其中啤酒企业12家&…...

数据仓库模式之详解 Inmon 和 Kimball

目录 一、前言 二、企业信息工厂&#xff08;Inmon&#xff09; 2.1 概念 2.2 主要组件 2.3 流程 三、多维数据仓库&#xff08;Kimball&#xff09; 3.1 概念 3.2 核心组件 3.3 流程 四、异同及用途对比 4.1 异同对比 4.2 特征比较 一、前言 大部分关于数据仓库构建…...

斐波那契数列数列系列问题详解

斐波那契数列数列是我们学习递归的入门问题&#xff0c;是一种非常经典的题型&#xff0c;也衍生出了一些更复杂的题型&#xff0c;这一节就让我们彻底理解斐波那契数列系列问题。 一、概念介绍 1、什么是斐波那契数列&#xff1f; 斐波那契数列&#xff08;Fibonacci sequenc…...

Day38力扣打卡

打卡记录 网格中的最小路径代价&#xff08;动态规划&#xff09; 链接 class Solution:def minPathCost(self, grid: List[List[int]], moveCost: List[List[int]]) -> int:m, n len(grid), len(grid[0])f [[0x3f3f3f3f3f] * n for _ in range(m)]f[0] grid[0]for i i…...

【C语言:深入理解指针二】

文章目录 1. 二级指针2. 指针数组3. 字符指针变量4. 数组指针变量5. 二维数组传参的本质6. 函数指针变量7. 函数指针数组8. 转移表9. 回调函数10. qsort函数的使用与模拟实现 1. 二级指针 我们知道&#xff0c;指针变量也是变量&#xff0c;它也有自己的地址&#xff0c;使用什…...

前端实现表格生成序号001、002、003自增

我们最终想要实现的效果如图&#xff0c;从后端获取数据之后&#xff0c;不使用data中的id&#xff0c;而是使用自己生成的按照顺序自增的序号id。 script <template><el-table :data"sticker" border style"width: 100%" id"stickerList&q…...

【Django-01】 视图函数和视图类

视图函数 作用详解视图函数的特点视图类实际开发怎么用一个无意义的demo 作用 用于返回给前端数据详解 def list(request):"""1.普通的视图函数 request是HttpRequest 函数2.且必须用request.GET|request.POST 指定方法是什么方法3.返回值不能用 rest_framewor…...

编译安装报错:configure: error: cannot guess build type; you must specify one

1、编译安装报错 configure: error: cannot guess build type; you must specify one 该报错信息翻过过来的意思是&#xff1a;无法猜测编译 操作系统类型,请指定一个 2、解决方法 在原本的编译安装语句后面加上一句&#xff1a; “--buildarm-linux ” &#xff0c;这句话…...

2311rust,到66版本更新

1.60.0稳定版 基于源码的代码覆盖率 rustc中已稳定支持基于LLVM的覆盖率检测.可用-Cinstrument-coverage重构代码,如: RUSTFLAGS"-C instrument-coverage" cargo build之后,运行生成的二进制文件,它在当前目录中生成一个default.profraw文件.环境变量可覆盖路径和…...

JOSEF约瑟 过电流继电器 JL15-300/11 触点形式一开一闭 板前接线

系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15-150/11电流继电…...

postman设置接口关联这样做,薪资直接涨3k

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…...

Java常见的bug

Java是一种强类型、面向对象的编程语言,有一些常见的bug或错误类型,尽管具体的bug会因项目和代码的不同而有所差异。以下是一些Java开发中常见的bug类型: 空指针异常(NullPointerException): 尝试在一个空对象上调用方法或访问属性时会引发空指针异常。这通常发生在没有对…...

gitea仓库镜像同步至gitlab

1、参考文档&#xff1a;仓库镜像 | Gitea Documentation 2、错误一&#xff1a;账号密码错误问题 解决方法&#xff1a; 出现以上错误为第三步用户名&#xff08;Oauth2应用名称&#xff09;或者密码&#xff08;Gitlab个人访问令牌&#xff09;错误。 1&#xff09;如下图1…...

服务器不备案的影响

服务器不备案的影响 不备案&#xff0c;不能解析域名。 但凡你的域名绑定到的是国内地址&#xff0c;你不备案&#xff0c;这个域名解析未来就可能会失效。 &#xff08;你借用的其它网站的子域名情况除外&#xff0c;因为他们的网站本身主域名有可能已经备案。&#xff09; …...

PHP 9.0正式版发布72小时后,我们压测了17家AI Bot厂商代码——93%存在协程上下文泄漏,你中招了吗?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP 9.0 异步编程与 AI 聊天机器人 性能调优指南 PHP 9.0 引入了原生协程&#xff08;Native Coroutines&#xff09;和事件驱动运行时&#xff08;Event Loop Runtime&#xff09;&#xff0c;为构建高…...

Sentaurus TCAD准静态分析参数详解:从Increment到Goal,手把手教你读懂那段‘天书’代码

Sentaurus TCAD准静态分析参数实战指南&#xff1a;从代码解析到调参技巧 第一次打开Sentaurus TCAD的仿真脚本时&#xff0c;那些密密麻麻的参数就像电路板上的焊点——看似杂乱无章却各有其存在的意义。特别是Quasistationary块中的那些数值&#xff0c;它们不是随意填写的魔…...

如何解锁Wallpaper Engine的视觉宝藏:开源逆向工程工具深度解析

如何解锁Wallpaper Engine的视觉宝藏&#xff1a;开源逆向工程工具深度解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字创意领域&#xff0c;资源提取和格式转换一直是技…...

摄影作品批量水印完整指南:3分钟学会自动添加专业相机参数和品牌标识

摄影作品批量水印完整指南&#xff1a;3分钟学会自动添加专业相机参数和品牌标识 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 你是否厌倦了为每…...

免费在线抠图透明背景用什么工具工具推荐

做自媒体这几年&#xff0c;平时拍产品、做人像、处理证件照&#xff0c;几乎每天都在琢磨一个问题&#xff1a;在线抠图透明背景用什么工具才能又快又不花钱&#xff0c;还不用下载一堆 App&#xff1f;尤其是 2026 年&#xff0c;各种 AI 工具爆发&#xff0c;但免费的往往带…...

DLSS Swapper终极指南:5分钟学会智能管理游戏DLSS文件,彻底告别手动替换烦恼

DLSS Swapper终极指南&#xff1a;5分钟学会智能管理游戏DLSS文件&#xff0c;彻底告别手动替换烦恼 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经为了提升游戏帧率&#xff0c;手动在各个游戏目录中寻找并…...

视觉语言模型几何对偶框架解决幻觉问题

1. 项目背景与核心挑战视觉语言模型&#xff08;VLM&#xff09;在跨模态理解任务中展现出强大能力的同时&#xff0c;也面临着"幻觉"问题——模型生成的描述与图像实际内容存在偏差。这种现象在医疗诊断、自动驾驶等关键领域可能造成严重后果。传统解决方法多从数据…...

Agent实战首秀!ChatBI股票分析助手:从0到1的智能分析搭建全记录

之前的文章# Text2SQL到数据智能&#xff0c;我们在技术工具的选择上&#xff0c;优先锚定成熟的框架体系来搭建基础能力。比如基于LangChain这类通用型Agent框架&#xff0c;搭配vanna这类专注SQL处理的专业组件&#xff0c;二者协同&#xff0c;既能承接通用场景的灵活需求&a…...

MySQL如何利用防火墙限制MySQL端口_使用iptables或安全组防御

应先放行本地回环&#xff08;-A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT&#xff09;&#xff0c;再拒绝外部访问&#xff08;-A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP&#xff09;&#xff0c;并配合安全组与 bind-address 协同防护。iptables 怎么封…...

告别脚本硬编码:用Oracle Data Integrator (ODI) 12c图形化搞定企业级数据同步

告别脚本硬编码&#xff1a;用Oracle Data Integrator (ODI) 12c图形化搞定企业级数据同步 当销售数据分散在MySQL、SQL Server和文件服务器中&#xff0c;而决策层需要实时查看整合报表时&#xff0c;传统ETL脚本的维护成本会像雪球一样越滚越大。上周刚调整的字段映射&#x…...