关于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大零售网络的全覆盖,…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
