在Java中LinkedHashSet有什么特点_Java有序Set实现解析
发布时间 - 2026-01-31 00:00:00 点击率:次LinkedHashSet 能保持插入顺序是因为底层用 LinkedHashMap 实现,其双向链表按插入顺序链接节点;它不支持 null 元素,非线程安全,时间复杂度 O(1),内存开销略高于 HashSet。
LinkedHashSet 保留插入顺序,但不是线程安全的,也不能存 null(除非你用的是 Java 8+ 的 removeIf 等操作间接触发,但本身仍不支持 null 元素)。
为什么 LinkedHashSet 能保持插入顺序?
它底层用 LinkedHashMap 实现 —— 每个元素作为 key 存进 LinkedHashMap,value 固定为 PRESENT(一个静态 Object)。而 LinkedHashMap 维护了一个双向链表,节点按插入顺序链接,所以迭代时自然有序。
这和 TreeSet 的“排序”完全不同:TreeSet 是按 compareT 或 
Comparator 排序,LinkedHashSet 只认“谁先来”,不比较大小。
- 插入、删除、查找平均时间复杂度都是 O(1),和
HashSet一致 - 内存开销略高:每个节点多两个指针(前驱/后继),比
HashSet多约 8–16 字节/元素 - 初始化时建议指定初始容量,否则扩容时链表重哈希会打乱“逻辑插入顺序”的局部性(虽然语义上仍正确)
LinkedHashSet 和 TreeSet 在什么场景下别选错?
如果你需要“按添加顺序遍历”,比如缓存最近访问项、记录用户操作流水、构建配置项加载顺序,就用 LinkedHashSet;如果你要“自动升序/自定义序”,比如排行榜、区间查询、去重并排序输出,就该用 TreeSet。
常见误用:
- 想按时间排序却用了
LinkedHashSet→ 实际只是按add()调用顺序,和系统时间无关 - 以为
LinkedHashSet支持重复元素的“多次插入” → 它仍是Set,重复add不生效,也不会更新位置 - 在多线程环境直接共享实例 →
LinkedHashSet非线程安全,ConcurrentHashMap+KeySetView或Collections.synchronizedSet()才是替代方案
构造 LinkedHashSet 时传入 Collection 会发生什么?
调用 new LinkedHashSet(Collection) 时,会按该集合的 iterator() 顺序逐个 add。这意味着:
- 如果传入的是
ArrayList,顺序就是列表索引顺序 - 如果传入的是
HashSet,顺序是不确定的(取决于其内部桶分布和哈希值) - 如果传入的是另一个
LinkedHashSet,顺序会被完整保留 - 传入
null会抛NullPointerException;传入含null元素的集合(如Arrays.asList(null))会在add时立即抛异常
所以别指望靠“用 HashSet 初始化 LinkedHashSet”来“去重并顺便排个序”——它只会把 HashSet 那套不可预测的迭代顺序固化下来。
最易被忽略的一点:它的序列化行为和 HashSet 不同,会把链表结构也写进去,反序列化后顺序严格还原;但如果你用 writeObject + 自定义序列化逻辑绕过默认机制,就可能破坏这个保证。
# java
# 字节
# 为什么
# Object
# NULL
# 指针
# Collection
# 线程
# 多线程
# 的是
# 链表
# 自定义
# 会把
# 序列化
# 你用
# 都是
# 升序
# 迭代
# 如果你
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
文字头像制作网站推荐软件,醒图能自动配文字吗?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何用免费手机建站系统零基础打造专业网站?
网站优化排名时,需要考虑哪些问题呢?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何配置和使用缓存?(Redis代码示例)
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
浅谈javascript alert和confirm的美化
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何在万网开始建站?分步指南解析
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
微信小程序 scroll-view组件实现列表页实例代码
Laravel如何集成Inertia.js与Vue/React?(安装配置)
网易LOFTER官网链接 老福特网页版登录地址
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Linux安全能力提升路径_长期防护思维说明【指导】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel如何发送系统通知?(Notification渠道示例)
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在Windows环境下新建FTP站点并设置权限?
Android使用GridView实现日历的简单功能
专业商城网站制作公司有哪些,pi商城官网是哪个?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
如何在万网ECS上快速搭建专属网站?
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Python面向对象测试方法_mock解析【教程】
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
,怎么在广州志愿者网站注册?
iOS中将个别页面强制横屏其他页面竖屏
如何用腾讯建站主机快速创建免费网站?
,南京靠谱的征婚网站?
如何快速启动建站代理加盟业务?
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
iOS正则表达式验证手机号、邮箱、身份证号等
详解jQuery中的事件
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
jQuery validate插件功能与用法详解
JS碰撞运动实现方法详解

