关于HashSet的五个问题
1.HashSet集合的底层数据结构是什么样的?
HashSet 集合的底层数据结构是哈希表,它是由一个数组和链表(或红黑树,具体取决于 JDK 版本)组成的数据结构。
-
数组:哈希表的主要部分是一个数组,它的每个位置称为槽位(slot)。数组的长度通常是一个质数,这有助于减少哈希冲突的发生。
-
链表或红黑树:每个槽位上存储的元素可能是一个链表或红黑树。当哈希冲突发生时,即多个元素计算得出相同的哈希码并且应该存储在同一个槽位上时,这些元素会以链表或红黑树的形式存储在该槽位上。在 JDK 8 及之后的版本中,当链表长度达到一定阈值时,会将链表转换为红黑树,以提高查找、插入和删除的效率。
-
哈希函数:哈希表使用哈希函数来计算元素的哈希码(hash code),并根据哈希码确定元素在数组中的存储位置。哈希函数将元素的键(或值)映射到数组的索引位置上,理想情况下,不同的元素应该被映射到不同的数组位置上,从而实现均匀的分布。
-
解决冲突:当多个元素计算出相同的哈希码时,就会发生哈希冲突。为了解决冲突,HashSet 使用链表或红黑树来存储具有相同哈希码的元素。在查找、插入和删除元素时,会根据元素的哈希码找到对应的槽位,然后在链表或红黑树中进行操作。
总的来说,HashSet 使用哈希表作为底层数据结构,通过哈希函数、数组、链表或红黑树等机制来实现高效的存储和检索操作。这种数据结构的选择使得 HashSet 具有快速的查找、插入和删除操作,并且不允许存储重复元素。
2.HashSet添加元素的过程?
HashSet 添加元素的过程如下:
-
计算哈希码:当你尝试向 HashSet 中添加一个元素时,首先会对该元素调用其
hashCode()
方法来获取它的哈希码。哈希码是一个整数,代表了元素的唯一标识。 -
确定存储位置:使用哈希函数将该元素的哈希码映射到 HashSet 的内部数组中的一个槽位(slot)上。这个过程会将哈希码转换为数组索引,从而确定元素在数组中的存储位置。
-
处理哈希冲突:如果该槽位已经被其他元素占据(即发生了哈希冲突),则在该槽位上会形成一个链表或红黑树。新元素将被添加到链表或红黑树的末尾,使得该位置存储了多个元素。
-
检查重复元素:在添加元素之前,HashSet 会检查该元素是否已经存在于集合中。它通过比较元素的哈希码和
equals()
方法来确定元素是否重复。如果元素已经存在,则不会重复添加。 -
添加元素:如果元素是新的(即不存在于集合中),则将其添加到哈希表中。如果发生了哈希冲突,新元素会被添加到链表或红黑树的末尾。
HashSet 添加元素的过程涉及哈希码的计算、数组的索引定位、哈希冲突的解决以及重复元素的检查,这些步骤保证了元素的唯一性和高效的存储。
3.HashSet为什么存和取的顺序不一样?
HashSet 存和取的顺序不一样是因为 HashSet 是基于哈希表实现的集合,而哈希表是一种无序的数据结构。
具体来说,HashSet 内部使用哈希函数将元素映射到内部数组的槽位上。在理想情况下,哈希函数可以将元素均匀地分布在数组的各个位置上,使得元素在数组中的存储位置看起来是随机的。
由于哈希表的无序性质,HashSet 在存储元素时不会保留元素的插入顺序。当你遍历 HashSet 中的元素时,元素的顺序看起来是随机的,这是因为它们在哈希表中的存储位置是根据哈希码计算得到的,并不代表它们被插入集合的顺序。
另外,HashSet 内部使用了链表或红黑树来解决哈希冲突,这进一步影响了元素的存储顺序。在 JDK 8 及之后的版本中,当链表长度达到一定阈值时,会将链表转换为红黑树,这也可能导致元素的顺序发生变化。
综上所述,HashSet 存和取的顺序不一样是由于其底层数据结构的无序性质以及哈希函数的随机性导致的。如果需要有序的集合,可以考虑使用 TreeSet 或 LinkedHashSet。
4.HashSet为什么没有索引?
HashSet 没有索引的主要原因是,它是基于哈希表实现的一种集合,而哈希表是一种无序的数据结构。
在 HashSet 中,元素的存储位置是通过哈希函数计算得出的,这个位置与元素在集合中的插入顺序或任何其他顺序无关。具体来说,哈希表的存储结构是一个数组,数组的每个位置称为槽位(slot)。当元素插入到哈希表中时,通过哈希函数计算得到元素的哈希码,并据此确定元素应该存储在数组的哪个槽位上。
由于哈希码的计算过程通常是不可逆的,因此无法直接从哈希码推导出元素的插入顺序。这就意味着,HashSet 中的元素是无序的,没有像列表或数组那样的索引来访问元素。
因此,HashSet 没有索引的概念,不能像数组或列表一样通过索引来快速访问元素。如果需要有序的集合,可以考虑使用 TreeSet 或 LinkedHashSet,它们提供了按照元素的自然顺序或插入顺序进行排序的功能。
5.HashSet是利用什么机制保证去重的?
HashSet 利用哈希表的机制来保证元素的去重。
当你向 HashSet 中添加一个元素时,HashSet 首先会计算该元素的哈希码(通过调用元素的 hashCode()
方法)。然后,HashSet 使用这个哈希码来确定元素应该存储在内部数组的哪个位置上。如果在该位置上已经有其他元素存储(即发生了哈希冲突),HashSet 将会比较新元素与已存储元素的哈希码和相等性,以确保不会存储重复的元素。
具体来说,HashSet 在存储元素时会比较新元素与已存储元素的哈希码是否相等,如果不相等,则直接将新元素存储在哈希表中。如果相等,则会进一步比较新元素与已存储元素的相等性(通过调用元素的 equals()
方法)。如果新元素与已存储元素相等(即 equals()
方法返回 true),则 HashSet 认为新元素已经存在,不会重复存储;如果不相等,则认为新元素与已存储元素不同,会将新元素存储在哈希表中。
这样,HashSet 通过哈希码和相等性来确保集合中不存储重复的元素,从而实现了去重的功能。
相关文章:
关于HashSet的五个问题
1.HashSet集合的底层数据结构是什么样的? HashSet 集合的底层数据结构是哈希表,它是由一个数组和链表(或红黑树,具体取决于 JDK 版本)组成的数据结构。 数组:哈希表的主要部分是一个数组,它的每个位置称为…...
linux性能调优汇总(一)cpu
目录 一、引言 二、CPU ------>2.1、/proc/cpuinfo ------>2.2、cpuid指令 ------>2.3、lscpu ------>2.4、turbostat ------>2.5、rdmsr ------>2.6、perf ------>2.7、top ------>2.8、ps ------>2.9、pidstat 查看每个进程CPU、内存、…...
CSS object-fit 属性
object-fit 属性指定元素的内容应该如何去适应指定容器的高度与宽度。 object-fit 一般用于 img 和 video 标签,一般可以对这些元素进行保留原始比例的剪切、缩放或者直接进行拉伸等。 您可以通过使用 object-position 属性来切换被替换元素的内容对象在元素框内的…...

使用LangChain LCEL生成RAG应用、使用LangChain TruLens对抗RAG幻觉
# 导入LangChain的库 from langchain import *# 加载数据源 loader WebBaseLoader() doc loader.load("https://xxx.html")# 分割文档对象 splitter RecursiveCharacterTextSplitter(max_length512) docs splitter.split(doc)# 转换文档对象为嵌入,并…...

npm淘宝镜像源更新
目录 前情提要: 背景: 镜像源更新: 清楚缓存: 直接切换镜像源: 补充: 错误解释: 解决方法: 前情提要: 2024 /1 /22 ,registry.npm.taobao.org淘宝镜像源的SSL…...

Navicat 干货 | 探索 PostgreSQL 的外部数据包装器和统计函数
PostgreSQL 因其稳定性和可扩展性而广受青睐,为开发人员和数据管理员提供了许多有用的函数。在这些函数中,file_fdw_handler、file_fdw_validator、pg_stat_statements、pg_stat_statements_info 以及 pg_stat_statements_reset 是其中的重要函数&#x…...

耳目一新的滑块版登录注册界面~
又到了毕业季,大家做毕设的时候总会参考已有的案例,不过大多产品的样式非常单一雷同。本帖博主给大家分享一个比较别树一帜的登录界面,如下: 如果没有账号,点击“去注册”,则会产生如下的效果: …...

分布式系统的发展史
目录 🐳今日良言:且视他人之疑目如盏盏鬼火,大胆地去走自己的夜路 🐇一、常见概念 🐇二、发展史 今日良言:且视他人之疑目如盏盏鬼火,大胆地去走自己的夜路 一、常见概念 在正式介绍分布式系…...
2024年腾讯云服务器最新价格表,CPU内存带宽系统盘报价
腾讯云服务器价格表2024年最新价格,轻量2核2G3M服务器61元一年、2核2G4M服务器99元1年,三年560元、2核4G5M服务器165元一年、3年900元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、8核32G配置115元1个月,345元3个月。CVM云服务…...
深入解析Oracle数据库ORA-01427错误:单行子查询返回多行的问题与解决办法
深入解析Oracle数据库ORA-01427错误:单行子查询返回多行的问题与解决办法 1、引言2、错误描述3、常见场景与示例4、解决方案5、声明 1、引言 在Oracle数据库日常运维与开发过程中,经常会遇到ORA-01427错误,这是一个很典型的数据库错误提示&am…...

【正点原子FreeRTOS学习笔记】————(12)信号量
这里写目录标题 一、信号量的简介(了解)二、二值信号量(熟悉)三、二值信号量实验(掌握)四、计数型信号量(熟悉)五、计数型信号量实验(掌握)六、优先级翻转简介…...

【数据分享】1929-2023年全球站点的逐年平均露点(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…...

PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教程
当前,城市生活的节奏日益加快,人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易,还是发布租房、求职信息,一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题&a…...

Linux相关命令(1)
1、找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。 find ./ -type f -name "*aaa*" ! -name "*bbb*" -exec touch {} \;文件系统操作命令 df:列出文件系统的整体磁盘使用情况 …...

NO9 蓝桥杯单片机实践之串口通信的使用
1 回顾 串口通信的代码编写结构还是与中断一样,不同的是: 初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器(定时器1用于产生波特率),但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。 vo…...

数据库管理-第163期 19c重建ADG的两个方法(20240323
数据库管理163期 2024-03-23 数据库管理-第163期 19c重建ADG的两个方法(20240323)1 ORA-081032 新办法1 关闭MRP2 恢复备库3 其他操作4 启动备库5 启动MRP 3 老办法4 预告总结 数据库管理-第163期 19c重建ADG的两个方法(20240323)…...

8款常见的自动化测试开源框架
在如今开源的时代,我们就不要再闭门造车了,热烈的拥抱开源吧!本文针对性能测试、Web UI 测试、API 测试、数据库测试、接口测试、单元测试等方面,为大家整理了github或码云上优秀的自动化测试开源项目,希望能给大家带来…...

【QT】:基本框架
基本框架 一.创建程序二.初识函数1.main2.Widget.h3.Wight.cpp4.Wight.ui5.文件名.pro 三.生成的中间文件 本系列的Qt均使用Qt Creator进行程序编写。 一.创建程序 二.初识函数 1.main 2.Widget.h 3.Wight.cpp 4.Wight.ui 此时再点击编辑,就看到了ui文件的本体了。…...
【Python】定时更换clashx工具
An empty street An empty house A hole inside my heart I’m all alone The rooms are getting smaller I wonder how I wonder why I wonder where they are The days we had The songs we sang together Oh yeah And oh, my love I’m holding on forever Reaching for a l…...

2024年第16届大广赛新命题发布-爱华仕箱包
2024年3月27日,2024年第16届大广赛发布了新的命题,爱华仕箱包命题,自2017年起,爱华仕箱包已连续8年担任全国大学生广告艺术大赛命题单位。 爱华仕现已实现百货、超市、电商、礼品、投标、海外市场6大零售网络的全覆盖,…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...