《HashMap的数据结构》

news2024/12/29 10:44:54

目录

HashMap概述:

 数据结构的组成:

一个键值对是如何存入该结构中:

HashMap中链表和红黑树的用途和转换方式 :


 

HashMap概述:

        

         HashMap是基于哈希表的Map接口实现的,它存储的内容是键值对<key,value>映射。

该类无序。

 数据结构的组成:

        在JDK1.7及以前,HashMap的数据结构是有数组+单向链表组成的。(在链表中插入元素采用头插法)

        在JDK1.8之后,HashMap的数据结构是有数组+单向链表+红黑树组成的。(在链表中插入元素采用尾插法)

        HashMap内部数据结构使用数组+链表+红黑树进行存储的。数组的类型为Node[ ],每个Node都保存了某个KV键值对元素的key、value、hash、next等值。如图:

                                

 每个Node对象都是单向链表的组成节点。

        

         在HashMap中存在加载因子(填充因子)默认为0.75。

        代表HashMap对数组容量的使用率为75%,超过该使用率则数组就会扩容。

        加载因子决定了HashMap对数组的使用率,加载因子越高,表示填满的元素就越多,集合的空间利用率就越高,但是冲突的机会就会增加。反之,越小则冲突越少,但是空间利用率就越低,浪费了很多空间。

 

 当

         一个键值对是如何存入该结构中:

                当添加一个KV键值对元素时,通过该元素的key的hash值,计算出该元素在数组中的下标。如果该下标位置已经有其他Node对象,则采用链地址法处理,即将新添加的KV键值对元素以链表的形式存储。将新元素封装成一个新的Node对象,插入到该下标位置的链表尾部。当链表的长度超过8并且数组的长度超过64时,为了避免查找搜索的性能下降,该链表会转成一个红黑树。

         当添加第一个KV键值对时,如果数组为空,则默认扩容为16。

        加入元素时,如果链表长度大于阈值(默认为8)并且数组长度小于64时,会产生数组扩容。

        添加元素后,当HashMap中的元素个数超过【数组大小×加载因子】时,原数组扩容2倍。

         在JDK1.7及之前计算下标时,采用hash%数组长度

        在JDK1.8之后,采用(数组长度-1)& hash。(提高了性能,数组的长度必须为2的N次幂)

HashMap中链表和红黑树的用途和转换方式 :

        HashMap采用数组+单向链表+红黑树组成。

        数组的特点:查询快,插入删除慢。

        链表的特点:查询慢,插入删除快。

        看一个实例:

                ​​​​​​​

                 有以上长度为9的数组,现在要存储key="张三"这样一个数据,假设他的hash值为423。用(数组长度-1)& hash计算下标 得0,将key存放在下标为0处。

        通过这样的方法也随之会产生一个问题——哈希冲突。因为数组的大小有限,我们计算的下标始终在一定范围内。这样我们难免会产生一样的索引,但是同一个位置又不能存放2个不同的key,所以就产生了哈希冲突。这样的话,链表的用处就来了,当发现数组上的位置被占用了,我们可以将key链接在该位置后。

        我们都知道链表的查询速度很慢,所以当链表上的数据过多时就会导致查询速度变慢。当链表的长度大于等于8并且数组长度大于64时,会将链表转换为红黑树,加快查询速度。当长度小于8时又会变成链表结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web安全:文件包含漏洞测试(防止 黑客利用此漏洞.)

Web安全&#xff1a;文件包含漏洞测试. 文件包含的漏洞是 程序员在开发网站的时候&#xff0c;为了方便自己开发构架&#xff0c;使用了一些包含的函数&#xff08;比如&#xff1a;php开发语言&#xff0c;include() , include_once() , require_once() 等等 &#xff09;&a…

书单 | 数据治理的30本书

随着数字经济时代的到来&#xff0c;数据的价值不断被发掘。党的十九届四中全会首次将“数据”列为生产要素&#xff0c;充分凸显了数字经济时代数据对于经济活动和社会生活的巨大价值。开展数据治理的理论探索和实践创新&#xff0c;有利于全面释放数据价值助力数字经济发展&a…

校园高校共享单车管理系统nodejs+vue+express

设计的管理员的详细功能见下图&#xff0c;管理员登录进入本人后台之后&#xff0c;管理单车和区域&#xff0c;审核租赁订单和还车订单&#xff0c;收取租赁费用&#xff0c;查看单车租赁统计信息。 vue的文件结构其实就是一个index.html 中间的内容&#xff0c;用的是vue&am…

代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点

二叉搜索树的最近公共祖先 题目链接&#xff1a;力扣 其实可以用之前普通二叉树最近公共祖先的算法。但是这样没有很好的利用二叉搜索树是有序的性质。 TreeNode* lowestCommonAncestor1(TreeNode* root, TreeNode* p, TreeNode* q) {if(!root || root p ||rootq) return roo…

嵌入式系统中重要的编程思想:分层与时间片

1. 分层思想 分层的思想&#xff0c;并不是什么神秘的东西&#xff0c;事实上很多做项目的工程师本身自己也会在用。分层结构确是很有用的东西&#xff0c;参透后会有一种恍然大悟的感觉。 如果说我不懂LCD怎么驱动&#xff0c;那好办&#xff0c;看一下datasheet&#xff0c…

Java技术规范概览

Java技术规范 目录概述需求&#xff1a; 设计思路实现思路分析1.Java JSR的部分2.JSR-000373.JSR-0000394.JSR-000337 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a bet…

三步快速激活chatGPT4

0、背景 Depay停止注册背景下&#xff0c;新用户如何开通chatGPT4&#x1f914;? 注意事项; 1.选在8:00-22:00之间阅读本教程&#x1f600;&#x1f601;&#x1f604; 2.本教程尝试过欧易和nodepay&#xff0c;但都不好用&#xff0c;故采用FOMEpay&#x1f60d;&#x1f60…

#Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐

关于Edge浏览器以及插件推荐 1.关于Microsoft Edge......1.1 什么是Microsoft Edge1.2Microsoft Edge的优势 2.Microsoft Edge的分屏功能2.1 如何分屏&#xff1f;2.2分屏的优势 3.Microsoft Edge插件推荐3.1 AIX智能下载器(图片/视频/音乐/文档)3.2 AdGuard 广告拦截器3.3 破解…

python基础知识(五):while循环、for循环、continue语句和break语句

目录 1. while循环2. for循环3. 循环语句和if语句结合3. continue语句4. break语句5. 双重循环6. 双重循环和continue语句以及break语句 1. while循环 while循环简单来说就是满足循环条件就执行循环语句&#xff0c;直到不满足为止&#xff0c;否则陷入死循环。 while语法 wh…

[架构之路-202]- 常见的需求获取技术=》输出=》用户需求、客户需求(As...., I want.....)、用例图

目录 前言&#xff1a; 11.2.1 直接的用户访谈 1 . 准备访谈 2 . 访谈过程 3 . 访谈的后续工作 4 . 用户访谈的优缺点 11.2.2 问卷调查 1 . 调查表的制作 2 . 问卷调查的优缺点 3 . 提高问卷返还率的方法 11.2.3 采样 1 . 样本大小 2 . 采样的优缺点 11.2.4 情节…

路径规划算法:基于生物地理学优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于生物地理学优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于生物地理学优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

上海亚商投顾:上证50创年内新低 电力、煤炭板块全天领跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日震荡调整&#xff0c;午后集体跌超1%&#xff0c;上证50一度跌近2%&#xff0c;尾盘跌幅有所收窄。芯…

MyBatis——动态SQL

经常遇到很多按照很多查询条件进行查询的情况&#xff0c;比如京东根据不同的条件筛选商品。其中经常出现很多条件不取值的情况&#xff0c;在后台应该如何完成最终的SQL语句呢&#xff1f; 如果采用JDBC进行处理&#xff0c;需要根据条件是否取值进行SQL语句的拼接&#xff0…

05 缓存预热+缓存雪崩+缓存击穿+缓存穿透

缓存血崩 发生 redis主机挂了&#xff0c;Redis 全盘崩溃比如缓存中有大量数据同时过期 解决 redis缓存集群实现高可用 主从哨兵Redis Cluster ehcache本地缓存 Hystrix或者阿里sentinel限流&降级开启Redis持久化机制aof/rdb&#xff0c;尽快恢复缓存集群 缓存穿透 是…

Gouraud Shading(高洛德着色法)和其优缺点详解

​ Gouraud是一种插值方法&#xff0c;Gouraud着色法是计算机图形学中的一种插值方法&#xff0c;可以为多边形网格表面生成连续的明暗变化。实际使用时&#xff0c;通常先计算三角形每个顶点的光照&#xff0c;再通过双线性插值计算三角形区域中其它像素的颜色。 在图形处理器…

Benewake(北醒) 快速实现TFLuna-IIC与电脑通信的操作说明

目录 1. 概述2. 测试准备2.1 工具准备 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TFLuna-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述&#xff0c;能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及查看哪些对应的 II…

小程序容器助力构建新型超级App软件应用架构

所谓软件架构&#xff0c;就是软件系统的骨骼与框架。近年来&#xff0c;软件及开源技术迅猛发展&#xff0c;软件应用架构的概念也愈加普遍。它提供了一种组织和设计软件系统的有效方法&#xff0c;具有许多优势和好处&#xff1a; 模块化和可维护性&#xff1a;软件应用架构将…

Spring Boot 集成Kafka简单应用

说明&#xff1a;当前kafka的版本为2.13-2.8.1&#xff0c;Spring Boot的版本为2.7.6。 第一步&#xff1a;在pom.xml中引入下述依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><ver…

Android之解决RecyclerView与NestedScrollView的滑动冲突方法

1、解决RecyclerView与NestedScrollView的滑动冲突 问题一&#xff1a;当我们滑动RecyclerView组件时&#xff0c;上方的轮播图并没有进行滑动&#xff08;NestedScrollView没有滑动&#xff0c;即滑动事件被RecyclerView消费了&#xff09;&#xff0c;当RecyclerView滑到底时…

Nginx的搭建和优化

目录 一. Nginx简介1.1 概述1.2 Nginx和Apache优缺点比较 二. Nginx编译安装步骤1 关闭防火墙&#xff0c;安装依赖包2. 创建运行用户和组3. 编译安装 Nginx4. 做软连接并启动nginx5. 停止Nginx6. 添加nginx系统服务方法一&#xff1a;编写脚本方法二 将nginx命令加入服务 7. 查…