0

0

Java集合框架中的HashSet与LinkedHashSet的比较

P粉602998670

P粉602998670

发布时间:2026-01-12 17:25:59

|

228人浏览过

|

来源于php中文网

原创

HashSet无序,基于HashMap;LinkedHashSet有序,基于LinkedHashMap并维护双向链表。二者插入/查找均为O(1),但后者内存略高、迭代稍慢,且序列化后顺序仅在反序列化为LinkedHashSet时保留。

java集合框架中的hashset与linkedhashset的比较

HashSet 和 LinkedHashSet 的底层实现差异

两者都基于 HashMap 实现,但关键区别在「如何维护元素顺序」: HashSet 完全不保证插入或遍历顺序,内部只用 HashMap 存储键值对(元素作为 key,固定值 PRESENT 作为 value); LinkedHashSet 则继承自 HashSet,但底层使用的是 LinkedHashMap —— 它在哈希表基础上额外维护了一个双向链表,记录插入顺序。

迭代时的顺序行为与性能开销

当你调用 iterator() 或用增强 for 遍历集合时:
- HashSet 返回的顺序是不确定的(取决于哈希值、扩容时机、JDK 版本),不能用于依赖顺序的逻辑;
- LinkedHashSet 严格按插入顺序返回元素,适合需要“记住添加先后”的场景,比如最近访问缓存、去重但保留原始序列的日志过滤。

性能上:
- 插入和查找平均时间复杂度都是 O(1)
- 但 LinkedHashSet 每次插入需更新链表指针,内存占用略高(每个节点多两个引用字段),迭代速度也稍慢(要沿链表走)。

构造函数参数含义不同

二者都有带初始容量和加载因子的构造方法,但注意:
- new HashSet(int initialCapacity, float loadFactor):仅影响底层 HashMap 的哈希桶数组大小;
- new LinkedHashSet(int initialCapacity, float loadFactor):同样控制哈希表部分,但链表结构不受这些参数影响——它始终存在且随插入动态增长。

常见误用:
- 认为给 LinkedHashSet 设大容量就能“提升顺序遍历性能” → 实际无意义,链表遍历成本与容量无关;
- 忘记 LinkedHashSet 仍会因哈希冲突导致桶内链表/红黑树结构,其“有序”仅指插入顺序,不等于“按哈希有序”或“按自然顺序”。

序列化与线程安全性一致

两者都不支持线程安全:
- 多线程写入未同步时,都可能引发 ConcurrentModificationException数据丢失
- 若需并发安全,应选 Collections.synchronizedSet(new LinkedHashSet())ConcurrentHashMap.newKeySet()(JDK 8+)。

序列化行为相同:
- 都实现了 Serializable
- 反序列化后,LinkedHashSet 仍保持插入顺序,HashSet 依然无序 —— 这一点常被忽略,尤其在分布式缓存或 RPC 场景中误以为序列化能“固化”某种顺序。

真正容易被绕过的点是:即使你用了 LinkedHashSet,只要中间经过 JSON 序列化(如 Jackson 默认转成数组),再反序列化回 Java 集合时若没指定类型为 LinkedHashSet,很可能变成 ArrayList 或默认 HashSet,顺序就丢了。

AI小聚
AI小聚

一站式多功能AIGC创作平台,支持AI绘画、AI视频、AI聊天、AI音乐

下载

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

C# 教程
C# 教程

共94课时 | 6.5万人学习

Java 教程
Java 教程

共578课时 | 45.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号