讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Java中处理List集合中的重复项并保持顺序_LinkedHashSet应用

梦磊姑娘_2288

梦磊姑娘_2288

发布时间:2026-02-28 13:42:56

|

342人浏览过

|

来源于php中文网

原创

如何在java中处理list集合中的重复项并保持顺序_linkedhashset应用

为什么 LinkedHashSet 能去重又保序,而 HashSet 不行

因为 LinkedHashSet 内部用哈希表 + 双向链表实现,插入顺序由链表维护;HashSet 只有哈希表,不记录插入顺序。Java 8 之后 HashSet 的迭代顺序虽有一定规律(取决于桶分布和扩容),但**不保证稳定**,不能当保序用。

常见错误现象:new HashSet(list) 转成集合后转回 ArrayList,发现元素顺序乱了,尤其在不同 JVM 版本或数据量变化时更明显。

  • 使用场景:清洗用户上传的 ID 列表、日志中按时间采集的事件流去重、前端传来的待处理任务队列
  • 参数差异:构造 LinkedHashSet 时传入 initialCapacity 和 loadFactor 对性能影响不大,除非你明确知道数据量极大且对初始化开销敏感
  • 性能影响:比 HashSet 略高一点内存占用(每个节点多两个指针),但时间复杂度仍是 O(1) 平均查找/插入

一行代码去重并保持顺序的写法及注意事项

最简写法是 new ArrayList(new LinkedHashSet(list)),但它有个隐藏坑:如果 list 是 null,会直接抛 NullPointerException。

实操建议:

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

立即学习“Java免费学习笔记(深入)”;

  • 始终先判空:Objects.requireNonNull(list, "list must not be null") 或手动检查
  • 如果原 list 是 Arrays.asList() 返回的不可变列表,new LinkedHashSet 仍能正常工作,但后续修改原列表不会影响新集合
  • 注意元素必须正确重写 equals() 和 hashCode(),否则重复判断失效 —— 这是 90% 的“去重失败”根源
  • 示例:List<string> deduped = new ArrayList(new LinkedHashSet(originalList));</string>

想保留首次出现位置,但原始 list 含 null 怎么办

LinkedHashSet 允许存一个 null,但如果原始 list 中有多个 null,它只会留第一个 —— 这符合“去重”预期,但容易被忽略。

问题在于:有些业务逻辑把 null 当作合法值(比如数据库字段允许为空),这时你得确认“多个 null 是否真该视为重复”。

  • 如果需要严格按对象语义去重(比如自定义类),null 值本身不会干扰,只要你的 equals() 实现合理(通常推荐用 Objects.equals(a, b))
  • 如果原始 list 是 List<integer></integer>,且含多个 null,LinkedHashSet 会只留一个,这是正确行为
  • 兼容性提醒:Java 7+ 都支持,无需额外依赖

替代方案对比:Stream.distinct() vs LinkedHashSet

list.stream().distinct().collect(Collectors.toList()) 看起来更函数式,但底层其实也是靠 LinkedHashSet 实现的(JDK 源码里明确用了它)。所以两者效果一致,但有细微差别:

  • Stream.distinct() 在小数据量下略慢(创建 Stream 对象、包装等开销),大数据量无明显差距
  • Stream 方式天然支持链式调用(比如接着 filter() 或 map()),适合组合操作
  • 容易踩的坑:distinct() 依赖元素的 equals()/hashCode(),跟 LinkedHashSet 完全一样,别以为换了写法就绕过这个问题
  • 不要为了“看起来现代”硬用 Stream —— 简单去重,LinkedHashSet 更直白、调试更方便
实际用的时候,最常被忽略的是元素自身的 equals() 和 hashCode() 是否真正覆盖到位,尤其是继承自父类、用了 Lombok 的 @Data 却忘了 @EqualsAndHashCode 的情况。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

650

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

533

2025.11.17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

100

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn