关于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大零售网络的全覆盖,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
