HashSet 、LinkedHashSet 源码级详解

Java Set深度解析:从hashCode契约到生产级选型决策 Set是Java集合框架中承载数据唯一性语义的核心抽象,其底层原理直指哈希表结构、红黑树平衡机制与并发内存模型。理解equals()与hashCode()的强一致性契约,是避免去重失效的前提;掌握HashSet扩容、TreeSet旋转、CopyOnWriteArraySet写时复制等行为差异,决定高并发与大数据场景下的性能拐点。在电商订单去重、风控白名单排序、实时监控指标管理等典型应用中,Set不仅是容器,更是数据一致性的第一道防线。本文聚焦JDK源码级实现细节与12个真实线上案例,揭示从开发规范到生产避坑 阅读详情

Set 集合类体系如下:

HashSet -- 无序、不重复、无索引

LinkedHashSet -- 有序、不重复、无索引

TreeSet -- 可排序、不重复、无索引

HashSet

HashSet 底层采用 哈希表 存储数据

哈希表组成

JDK8 之前  -- 数组 + 链表

JDK8 之后  -- 数组 + 链表 +红黑树

一开始会把元素存储在数组中,但是哈希表会出现同一个索引位置要存储多个元素的情况,因此要将同一个索引位置的多个对象用链表或红黑树进行存储

哈希表的核心 -- 哈希值

哈希值我们可以理解为对象的整数形式

因为在哈希表存储的时候,不是从索引零开始按序存储的,而是根据公式

int index = (数组长度 - 1 )& 哈希值

index就是对象存储的位置

对象可以根据 hashCode 方法计算出哈希值,该方法定义在Object类中,因此所有对象都可调用,默认使用地址值进行计算,但是一般情况下用对象的地址值计算哈希值的意义不大,因此一般情况下会重写 hashCode 方法,利用对象内部属性计算哈希值

关于 hashCode 方法 重写,最重要的是 hashCode 方法和 equals 方法的联系,可以参考以下博客

(8条消息) 为什么重写 equals 方法就必须重写 hashCode 方法?_Fearless____的博客-优快云博客https://blog.youkuaiyun.com/Fearless____/article/details/131786820

我们对 对象相等 的定义是:当两个对象 equals 返回 true 时,则两个对象就是相同的

但是当两个对象不相等时,可能会得到相同的哈希值

哈希表存储的原理:

  • 通过哈希值计算出存储的位置,如果该位置为null,则直接存入;
  • 如果不为null,则调用equals方法(不为null说明多个对象的哈希值相等,但是哈希值相等不代表元素相等,元素是否相等的标准由equals判断),如果该位置存在equals为true的元素,则不存储,如果没有则存储(以链表或红黑树的形式存储)

所以从上面看出,哈希值具有两个作用,一是计算出存储位置,二是初步判断哈希表中是否存在相同元素

正是因为哈希表具有不存储相同对象的特点,HashSet才能做到不重复

又因为哈希表是数组+链表+红黑树,并且不是从索引0开始按序存储,所以HashSet是无序的、无索引的

如下图,在遍历的时候,会先查看0索引位置,没有元素,那么查看1索引位置,遍历该链表,继续查看2索引位置... 以此类推,因此遍历的结果是 黄 -> 橙 -> .. -> 深蓝 -> 浅蓝 ,而我们存储的顺序可能是 橙 -> 浅蓝 -> ... -> 蓝->黄

LinkedHashSet

本质上跟 HashSet 相同,只不过多了个双链表的机制记录储存的顺序

现在我们要将这四个元素存入哈希表中

 现在存入第一个元素,此时还有一条双向链表,双向链表的头结点指向该元素

存入第二个元素,此时,第一个元素会记录下第二个元素的地址值,第二个元素也会记录第一个元素的地址值,这就形成了一个双向链表

存入第三个元素,第三个元素和第四个元素间同样会相互记录地址值

 存入第四个元素

接下来要遍历的时候,不再和HashSet相同,而是直接从头节点开始遍历该双向链表,最后得到的结果就是有序的

Java彩票模拟:HashSet、ThreadLocalRandom与Scanner深度实践 Java集合框架中的HashSet提供O(1)平均时间复杂度的去重能力,其底层哈希表机制依赖hashCode与equals契约,是实现‘不重复随机数’约束的最优选择;伪随机数生成器如ThreadLocalRandom通过线程局部种子规避并发碰撞,显著优于传统Random实例;而Scanner作为标准输入门面,需警惕缓冲区残留、资源泄漏及非法输入校验等常见陷阱。三者协同构成Java基础能力的压力测试场,广泛应用于抽奖系统、测试数据生成、风控规则模拟等工程场景。本文以9个100~999区间不重复随机数生成为切口 阅读详情

相关推荐

Java彩票模拟题:HashSet去重与随机数边界控制实战

HashSet是Java中基于哈希表实现的无序不重复集合,其去重机制依赖hashCode()与equals()协同判断,底层通过数组+链表(或红黑树)结构实现O(1)平均插入性能;随机数生成需精准控制区间边界,如nextInt(900)+100确保100~999三位数范围,避免nextInt(1000)引入非法值;这些基础能力直接支撑高并发场景下的数据唯一性保障与输入健壮性设计,在用户投注、订单号生成、缓存键去重等真实业务中广泛存在。本文以彩票号码生成为切入点,解析HashSet内存布局、Random边界陷

weixin_33957648的博客 603

LinkedHashSet详解

LInkedHashSet这个容器不知道大家在平时的工作用的多吗,反正我基本上没有用过,所以,本文主要对于它的特点、使用场景、实现原理,做一个讲解,希望对大家平时的工作有所帮助。LinkedHashSet是一个基于LinkedHashMap实现的有序去重集合列表。LinkedHashSet中的元素没有重复LinkedHashSet中的元素有顺序,维护了添加顺序LInkedHashSet可以存储null值LinkedHashSet是一个线程不安全的容器。...

Chenhui98的博客 1万+

Java Set底层原理与生产级选型指南

Set是Java集合框架中表达‘唯一性’与‘成员关系’的核心抽象,其设计根植于数学集合概念,通过哈希表、红黑树、跳表等数据结构实现不同行为契约。理解hashCode与equals协同机制、fail-fast迭代器原理、以及各实现类(HashSet/TreeSet/LinkedHashSet/ConcurrentSkipListSet)的时间复杂度与内存特性,是避免线上contains失效、排序异常、并发不一致等高频问题的关键。在电商去重、实时风控、日志窗口统计等典型场景中,选型错误可导致性能下降十倍甚至引发

weixin_34007020的博客 462

HashSet-哈希值

哈希值(哈希码值)? 是JDK根据对象地址, 或者属性值, 计算出来的int类型的值 Object类中有一个方法可以获取对象的哈希值 public int hashCode(); 根据对象地址计算哈希值并返回 对象哈希值的特点? 1. 如果我们没有重写hashCode(), 那么根据对象的"地址值"计算哈希值 同一个对象多次调用hashCode()获取的哈希值是一样的, 因为地址一样 不同对象的哈希值是不一样的, 因为地址不一样...

qq_43294932的博客 1553

java基础 数据结构

✅数组快但不灵活,集合灵活但有成本。

a378113472的博客 476

阿里P5初级Android面经:Java集合源码、ArrayList扩容、HashMap原理、线程安全集合

本文总结了阿里巴巴Java面试的核心考点,重点剖析了Java集合框架的底层实现原理。文章对比了阿里与腾讯的面试风格差异,指出阿里更注重技术深度挖掘。核心内容包括:ArrayList扩容机制(1.5倍增长、数组拷贝)、LinkedList与ArrayList的性能对比、HashMap在JDK1.8的优化(红黑树、扰动函数)、线程安全集合的实现差异(ConcurrentHashMap的CAS+synchronized机制)等。特别强调阿里面试要求源码级理解,如HashMap的put过程、扩容策略等实现细节。

郑伟强dev的专栏 41

Java Set集合深度解析:HashSet、TreeSet与LinkedHashSet的实现原理与选型指南

在Java编程中,集合框架是处理数据结构的核心组件,而Set接口作为集合框架的关键部分,专门用于存储不重复元素。其底层实现原理基于不同的数据结构:哈希表通过hashCode()和equals()方法实现O(1)时间复杂度的快速查找;红黑树则通过Comparable或Comparator接口实现元素的自动排序,时间复杂度为O(log n)。这些技术方案在工程实践中具有重要价值,能够有效解决数据去重、快速检索和有序存储等常见问题。例如,在用户系统管理、数据统计分析和缓存实现等应用场景中,Set的不同实现类各显其

weixin_31102231的博客 343

科研党必看!Zotero+Claude3插件实战:如何用AI高效阅读文献(附详细配置步骤)

本文详细介绍了如何通过Zotero与Claude3插件的深度整合,实现科研文献的高效阅读与管理。从环境配置到核心功能实战,包括智能摘要生成、精准学术翻译和论文写作辅助等,帮助科研人员大幅提升工作效率。特别适合需要处理大量文献的研究者使用。

o0p1q2r3的博客 433

【Java 基础篇】Java HashSet 深度解析:从哈希表原理到实战避坑指南

本文深度解析Java HashSet的底层实现原理,从哈希表工作机制到实战避坑指南。详细介绍了HashSet基于HashMap的存储机制、哈希表工作原理、负载因子与扩容机制,以及如何避免常见错误如可变对象作为元素和未正确实现hashCode与equals。同时提供了性能优化建议和最佳实践,帮助开发者高效使用HashSet进行数据去重和集合运算。

463

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 358

Unreal浅做一个MetaBall

Raymaching其实就是实时场景的一种渲染方法。主要原理网上有很多详细介绍。简单来说就是,以摄像机为原点,发射很多条射线,而每一条射线以步长为单位向前采样,同时以采样点和最近的物体像素的距离为半径进行一个球形检测。检测到摄像机和场景像素在当前射线方向的距离差小于某个值,就表示射线到达物体表面,然后画这个像素。

xzljj的博客 335

Java Set集合深度解析:HashSet、TreeSet、LinkedHashSet原理与实战选型

在Java集合框架中,Set接口是实现数据去重的核心组件,其基于哈希表或树结构保证了元素的唯一性。从数据结构原理来看,HashSet通过哈希算法实现O(1)时间复杂度的快速查找,TreeSet借助红黑树提供有序存储与范围查询能力,LinkedHashSet则在哈希表基础上通过双向链表维护插入顺序。这些特性决定了它们在不同工程场景下的技术价值:HashSet适用于高频去重但无需顺序的场景,TreeSet在需要排序或范围检索时表现优异,LinkedHashSet则兼顾了去重与顺序保持。在实际开发中,合理选择Se

weixin_31960565的博客 250

解决Windows无法卸载补丁的实用方法

无法卸载Windows补丁可能是一个棘手的问题,但通过上述方法,你应该能够找到解决方案。无论是通过控制面板、命令提示符还是手动重置Windows更新组件,都有可能成功卸载问题补丁。如果所有方法都无效,系统还原将是一个值得尝试的备选方案。希望这篇文章能帮助你解决无法卸载补丁的问题。

mmoo_python的博客 1万+

Java基础28-Java 集合基础:HashSet 去重原理(依赖 HashMap 详解)

摘要: 本文深入解析Java中HashSet的去重机制,揭示其完全依赖HashMap的实现原理。HashSet通过将元素作为HashMap的Key存储,利用哈希表实现高效去重。关键点包括:hashCode()快速定位存储位置,equals()精确比较元素唯一性;自定义对象必须正确重写这两个方法;JDK8+优化哈希冲突处理,链表过长时转为红黑树。文章通过源码分析、架构图解和代码示例,帮助开发者深入理解这一核心集合类的工作机制。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

从0到1打造工业级上位机:通信协议到架构设计的实战全流程

作为一名在工控领域摸爬滚打十余年的开发者,前阵子刚帮一家新能源工厂完成了一套工业上位机系统的从0到1搭建。从最初和PLC通信联调时的“连不上、传错数”,到最终系统7×24小时稳定运行,踩过的坑、攒下的实战经验,今天就毫无保留地拆解给各位同行。这篇文章会从通信层、数据层、UI层到架构层逐层深入,全是工业现场验证过的干货,新手也能跟着落地。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 664

工业-实时数据采集

在主节点使用Flume采集/data_log目录下实时日志文件中的数据,将数据存入到Kafka的Topic 中(Topic名称分别为ChangeRecord、ProduceRecord和EnvironmentData,分区数为4),Flume 采集ChangeRecord。

dafsq的博客 590

超直观图解:Java Set如何防止元素重复?看完就忘不了!

Set去重机制:HashSet用哈希表(hashCode+equals),查询O(1);TreeSet用红黑树(Comparator),增删O(log n);LinkedHashSet加链表记顺序;CopyOnWriteArraySet写时复制保线程安全。注意:equals与hashCode需同时重写;TreeSet的compareTo要等于equals;存入后关键字段不可改。选型:查多用HashSet,排序用TreeSet,保序用LinkedHashSet,线程安全用CopyOnWriteAr

yiridancan的博客 990

【RT-DETR涨点改进】全网独家-特征融合改进篇 | AAAI 2025 顶会| 高效涨点,RT-DETR利用CDFA对比度特征聚合模块,适用于目标检查(全网独家创新)

本文提出了一种基于CDFA模块的多级特征融合优化RT-DETR模型,用于解决医学图像分割中的软边界模糊、小目标和共现现象等问题。CDFA模块通过对比度特征聚合、局部特征增强和多级注意力机制,有效提升模型性能。研究提供了三种改进方案(rtdetr-r18/y50/l-CDFA),并在多个医学数据集上验证了其有效性。核心创新包括语义信息解耦、对比驱动特征融合和尺寸感知解码器。实验结果表明,该方法在分割精度和鲁棒性方面达到SOTA水平。

Ai缝合怪、助力小伙伴高效发论文 510

Java集合框架面试核心考点与深度解析

Java集合框架是Java开发者必须掌握的核心技术之一,它通过Collection和Map两大接口体系提供了丰富的数据结构实现。从数据结构原理来看,ArrayList基于动态数组实现随机访问O(1)特性,LinkedList采用双向链表优化插入删除操作,HashMap则通过哈希表+红黑树实现高效键值存储。在并发场景下,ConcurrentHashMap的分段锁和CAS机制展现了Java集合的线程安全解决方案。这些设计在电商系统、缓存实现等高频并发场景中具有重要价值。针对面试场景,特别需要关注HashMap扩

weixin_33755649的博客 344

【数据结构】期末考试复习(考点+例题)

1.线性表定义及其存储实现:顺序表和链接表,优缺点分析(顺序存储可随 机访问,链式存储可灵活利用空间),相关操作的时间复杂度。 2.链表的插入删除操作 3.两种特殊的线性表及其应用:栈、队列 4.栈、队列上的(插入/删除)操作及其特点 5.循环队列满和空的条件 6.能够定义线性表、栈、队列的数据存储结构,能够实现相关操作的算法并 分析时间复杂度(例如插入、删除及其它应用等) 7.理解线性结构的应用( 如根据要求能灵活定义线性表结构,能根据线性表 的插入、删除操作解决实际问题) 二叉树基本概念与性质(高

Molly 的博客 9371

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

集合框架 (六)

Java集合框架是存储和操作数据的核心工具,分为单列集合Collection和双列集合Map两大体系。Collection包括List(有序可重复)、Set(无序不重复)和Queue(队列);Map存储键值对,Key唯一。常用实现类有ArrayList、LinkedList、HashSet、HashMap等,各有特点:ArrayList基于动态数组查询快,LinkedList基于链表增删快,HashSet去重,HashMap键值映射高效。集合提供了丰富的API和遍历方式,支持泛型保证类型安全。开发中需注意线

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 239

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

面试官:Set 如何保证元素不重复的?

后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,面试官提出这个问题,核心是想考察你对 Java 集合框架设计的深入理解,而非仅仅记住一个 API。如果该桶非空(哈希冲突),则遍历该桶内的链表或红黑树节点,对每个已存在的键。,只要比较器认为它们相等(返回0),也会被视作重复。的键(Key)存储,而值(Value)则统一存储为一个名为。返回 0,则认为两个元素 “相等”,新元素不会被加入。

犬小哈 392

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

别再背八股:ArrayList与LinkedList源码级剖析与实战避坑指南

Java集合框架中的List接口是日常开发最常用的数据结构之一,而ArrayList与LinkedList的底层实现差异、扩容机制以及迭代器行为,直接影响着系统性能与稳定性。理解数组连续内存与链表节点分散的内存模型,能解释为何随机访问、增删操作的真实复杂度与直觉不同。ArrayList基于动态数组,通过grow()实现1.5倍扩容;LinkedList基于双向链表,在持有节点引用时才具备O(1)插入优势。同时,modCount与fail-fast机制保证了遍历时对并发修改的快速失败,而CopyOnWrite

weixin_34075268的博客 440

Java集合框架深度解析:从数据结构到并发编程的40道核心面试题

在Java开发中,数据结构是构建高效、健壮应用的基石。集合框架作为Java核心API,封装了数组、链表、哈希表、树等经典数据结构,提供了统一的操作接口。其设计哲学在于通过抽象(如Collection、Map接口)与迭代器模式,实现了数据存储与遍历的解耦。理解其底层原理,如HashMap的哈希计算、扩容机制与红黑树优化,对于编写高性能代码至关重要。在并发场景下,快速失败(Fail-Fast)与安全失败(Fail-Safe)机制揭示了线程安全的不同实现路径,而ConcurrentHashMap的锁粒度细化与Co

weixin_30924239的博客 516

Java集合框架面试题解析与底层实现

Java集合框架是Java开发者必须掌握的核心技术之一,涵盖了数据结构、算法和并发编程等多个基础概念。其核心原理基于不同数据结构的特性实现,如ArrayList基于动态数组、LinkedList基于链表、HashMap采用数组+链表+红黑树结构。这些集合类在内存管理、性能优化和线程安全方面各有特点,适用于不同场景。在实际工程中,合理选择集合类型能显著提升系统性能,比如HashMap的负载因子设计在空间和时间效率间取得平衡。掌握集合框架的底层实现原理,不仅能应对技术面试,更能优化代码性能,解决实际开发中的并发

weixin_34199405的博客 992

Java 集合框架万字梳理:从底层原理、源码细节到生产选型,一篇全搞定

本文系统梳理 Java 集合框架完整知识体系,涵盖核心接口、主流实现类底层原理、迭代机制、高频坑点、Stream API 以及生产场景选型指南,一篇帮你建立完整的集合知识体系。

一线 Java 开发,专注 Java 核心原理、生产踩坑与架构面试实战。 570
上一篇: 为什么重写 equals 方法就必须重写 hashCode 方法?
下一篇: Java List集合 -- 最常用的两种排序方法
Fearless____
博客等级 码龄5年 14粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值