HashMap 简述

news2025/1/15 6:32:36

文章目录

  • 前言
  • 一、HashMap的数据结构
  • 二、HashMap存储数据的大致过程
    • 1 哈希值
    • 2 什么是哈希冲突?
    • 3 为何有两种数据结构?
  • 三、HashMap常用知识
  • 总结


前言

HashMap 是开发中常用的一种数据结构,通常用做返回值,计算比对等,会经常用到;


一、HashMap的数据结构

jdk8之后,数据结构是 数组+链表 或者 数据+ 链表+红黑树实现的;

二叉树,红黑树?
红黑树是二叉树的进化版本:

  • 1、左子树的所有节点的值均小于其根节点的值。
  • 2、右子树的所有节点的值均大于其根节点的值。
  • 3 、左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
  • 这里选择红黑树的原因具体可以参考我的另一篇文章 mysql索引 因为二叉树是有缺陷的,它可能退化成一个链表,而非数,这样查找效率依然是低下的;

二、HashMap存储数据的大致过程

hash示意图

1 哈希值

当我们存入一对key-value 的时候,我们对这个节点的key进行哈希算法运算,算好之后放入到Node 中,这样就有了它自己的唯一下标(哈希值对当前数组长度取模),不通的哈希值有不同的下标;

2 什么是哈希冲突?

可是很多key的hashcode值如果相同,下标相同怎么办? 于是出现了链表结构,就是当很多key的hashcode值相同的时候,即哈希冲突,那么此时会在这个下标下面挂出一个链表,用来存储产生了哈希冲突的key,那么它的下标如何计算? 哈希值都是同一个,应该是对当前所在链表的长度取模,作为它的唯一下标;

3 为何有两种数据结构?

数组+链表 或者 数据+链表+红黑树

当一直产生哈希冲突,链表长度超过8个之后,此时查询效率低下,所以采用了红黑树的结构,方便快速查找,提高查询效率

三、HashMap常用知识

  • HashMap中有两个重要的参数:初始容量大小和加载因子,初始容量大小是创建时给数组分配的容量大小,默认值为16,加载因子默认0.75f,用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用rehash方法将数组容量增加到原来的两倍,专业术语叫做扩容.
  • 在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.
  • 所以HashMap的大小通常是2的幂次方;
  • HashMap存储的键值对,key重复的时候,value 会被更新, 允许key为 null 的存在
  • HashMap的遍历
    • keys
    • vlaues
    • entryset
    • foreach
    • iterator

总结

这里仅仅是对于hashmap的一个简单介绍,主要说明了哈希冲突的由来,以及底层存储结构的选择的理由;

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

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

相关文章

时至今日,Pascal系列Turbo Pascal 5.0依旧是我心中永远的神

从DOS时代到Windows时代,从桌面应用到Web应用,每一个时代都有它特定的编程工具 在我看来,DOS时代的编程语言,Pascal必占一席之地。 尤其是Turbo Pascal系列的最后一个版本——Turbo Pascal 5.0,更是我心目中永不褪色的…

nginx企业级高性能配置优化

一、基础配置优化 1、CPU亲和性优化 1.1、推荐直接将配置项设置成auto (worker_cpu_affinity),即采用了Nginx推荐的CPU绑核策略方式。 1.2、手动绑定,将worker线程数量与CPU核心数一一绑定方式设置,设置成auto Nginx会自动识别并按照推荐策略…

New Bing 全面开放?我看未必

前段时间大家应该都被ChatGPT刷屏了,其实就回答来说New Bing 才是最厉害的,因为它底层使用了ChatGPT 并且可以支持联网查询数据,回答中还能支持看到出处,方便确认其真实性。 New Bing 是微软基于 OpenAI ChatGPT 技术开发的新一代…

vue3项目搭建

一、安装 vue3.0 脚手架 (1)node安装(前端开发环境) 打开node官网:https://nodejs.org/zh-cn/ 下载node并安装(安装vue3建议node在10.0版本以上)。 输入node -v可显示node版本 (2)…

使用思维链(Chain-of-thoughts)提示在大型语言模型中引出推理

语言模型(LM)在NLP领域的发展速度非常快,特别是在大型语言模型(LLM)方面:当语言模型具有大量参数或权重/系数时,它们被称为“大型”。这些“大型”语言模型拥有处理和理解大量自然语言数据的能力。 LLM被用于一系列自然语言任务,…

【Java EE】-Servlet(三) MessageWall

作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 寂寞会发慌,孤独是饱满的。——史铁生《命若琴弦》 主要内容:前后端交互接口协商,约定好,使用什么数据格式传输&…

变现 起航篇! 手把手交你用chatgpt快速生成视频!

Chatgpt 很多同学都用的非常熟练了,但是都停留在文字阶段,有没有更好玩的用法,可以深度的利用chatgpt做一些事情呢? 今天菜哥就找一个方法可以快速利用chatgpt制作视频,整个过程大概3分钟,非常有趣&#xf…

浪涌保护器的工作类型及其应用

所有电路系统中的电气设备都需要浪涌保护器的保护支持。这主要取决于器件的内部电路如何能够处理电压波动。如果器件出现输入电压波动,则会导致器件损坏,因为电源电压的波动可能对器件有害。在本文中,我们将了解什么是浪涌保护器,…

【源码+个人总结】Spring 的 三级缓存 解决 循环依赖

Spring可以通过以下方法来避免循环依赖: 构造函数注入:使用构造函数注入来注入依赖项,这是一种比较安全的方式,因为在对象创建时就会注入依赖项,可以避免循环依赖。 Setter方法注入:使用Setter方法注入依赖…

云开发谁是卧底线下小游戏发牌助手微信小程序源码

源码下载:https://download.csdn.net/download/m0_66047725/87614365 云开发谁是卧底线下小游戏源码,发牌助手微信小程序源码。 “谁是卧底OL”是一个非常有趣,风靡全国的比拼语言表述能力、知识面与想象力的游戏。 谁是卧底OL是一款由开发…

Notepad++下载安装NppFTP插件

文章目录 一、Notepad内下载安装NppFTP插件1.打开Notepad——插件——插件管理2.找到NppFTP插件——点击安装3.安装完成 二、直接下载安装NppFTP插件1.网盘下载2.将下载好的NppFTP插件放入到Notepad\plugins的插件目录下3.重启Notepad 三、Notepad下载总结 一、Notepad内下载安…

【刷题】142. 环形链表 II

142. 环形链表 II 一、题目描述二、示例三、实现3.1 方法13.2 方法2 142. 环形链表 II 一、题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 nex…

前端学习 - 淼哥学Vue

如何判断数据是否受Vue管理,数据(对象,数组,字符串等)能否响应式更新? 即查看数据是否有对应get/set方法,数组没有对应get/set方法,故操作数组要通过其封装好的变更方法 变更方法 …

js高级知识汇总一

目录 1.怎么理解闭包? 2.闭包的作用? 3.闭包可能引起的问题? 4.变量提升 5.函数动态参数 6.剩余参数 ...(实际开发中提倡使用) 7.展开运算符 8.箭头函数 9.解构赋值(数组、对象) 10 创…

一文总结动态规划

动态规划 一、背包问题1 问题定义2 问题分类3 解题模板01背包最值问题剩余背包问题 4 例题分析LeetCode1049.最后一块石头的重量II 二、区间动态规划1 解题模板2 例题分析牛客.石子合并 总结与分析 一、背包问题 1 问题定义 如何确定一个题目是否可以用背包问题解决 背包问题…

给儿童使用护眼台灯怎么样选择更好?专家建议孩子买台灯

随着娃越长越大,虽然还在读幼儿园,但平时免不了要写写画画,之前一直在这个桌子上,台灯是一个赠送的LED货色,那个频闪啊,于是趁着当地商场活动先入了张学习桌椅,至于台灯嘛当然要选个好的了&…

21财经专访徐亚波博士:AI恒纪元时代,数说故事踏浪新征途

21世纪经济报道【创业投资】栏目,一直致力于寻找中国最有生命力和创造力的快速成长公司,探秘其背后的新兴资本推动力。为此,数说故事创始人兼CEO徐亚波博士接受了21世纪经济报道的专访。 近年来,大数据产业已经成为推动数字经济发…

【C语言】都玩过三子棋游戏把,但你知道怎么用C语言实现三子棋游戏吗?让我来手把手教你。

三子棋游戏 1.前言2.功能分析2.1主函数设计及菜单设计2.2打印棋盘与棋盘初始化2.3玩家下棋2.4电脑下棋2.5判断输赢 3.game.h头文件展示4.text.c源文件文件展示5.game.c源文件文件展示 所属专栏:C语言 博主首页:初阳785 代码托管:chuyang785 感…

Android 开发中高阶函数的 10 个实例

Android 开发中高阶函数的 10 个实例 Kotlin 是一种现代编程语言,由于其表现力、简洁性和多功能性而变得越来越流行。它的关键特性之一是支持高阶函数,这使您可以编写更简洁、更灵活的代码。高阶函数是一种将一个或多个函数作为参数或返回一个函数作为结…

python+java+nodejs基于vue的企业人事工资管理系统

根据系统功能需求分析,对系统功能的进行设计和分解。功能分解的过程就是一个由抽象到具体的过程。 作为人事数据库系统,其主要实现的功能应包括以下几个模块: 1.登录模块 登录模块是由管理员、员工2种不同身份进行登录。 2.系统管理模块 用户…