0

0

在Java里如何处理集合中的重复元素_Java集合去重操作解析

P粉602998670

P粉602998670

发布时间:2026-02-11 13:52:50

|

992人浏览过

|

来源于php中文网

原创

hashset去重最常用但不保序,需重写equals/hashcode;stream.distinct()保序但性能略低;手动遍历效率差;业务去重需用tomap或groupingby结合merge逻辑。

在java里如何处理集合中的重复元素_java集合去重操作解析

HashSet 去重是最常用也最直接的方式

Java 中最常用的去重方法是把集合转成 HashSet,利用其“不允许重复元素”的特性自动过滤。适用于不需要保持原顺序、且元素实现了 equals()hashCode() 的场景。

常见错误现象:HashSet 去重后顺序完全打乱;自定义对象去重失败(比如始终认为所有对象都不同)。

  • 确保自定义类重写了 equals()hashCode(),否则 HashSet 无法正确判断相等性
  • 如果需要保留插入顺序,改用 LinkedHashSet 替代 HashSet
  • 原始集合为 null 时会抛 NullPointerException,需提前判空

示例:

List<String> list = Arrays.asList("a", "b", "a", "c");<br>Set<String> uniqueSet = new HashSet<>(list); // 结果:[a, b, c],顺序不确定

Stream.distinct() 保持顺序并去重

JDK 8+ 提供的流式去重方式,底层依赖元素的 equals() 判断,天然保留原始顺序(前提是源集合有序,如 ArrayList)。

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

使用场景:需要链式调用、配合其他流操作(如过滤、映射),或明确要求结果顺序与原集合一致。

GPTZero
GPTZero

全球第一的AI检测器,人工智能检测的领导者

下载
  • distinct() 是有状态操作,性能略低于纯遍历,大数据量时注意 GC 压力
  • 对数组或基本类型数组不直接适用,需先转为包装类型流(如 Arrays.stream(ints).boxed().distinct()
  • 自定义对象同样依赖 equals()/hashCode(),未重写则每个实例都被视为不同

示例:

List<Integer> nums = Arrays.asList(1, 2, 2, 3, 1);<br>List<Integer> unique = nums.stream().distinct().collect(Collectors.toList()); // [1, 2, 3]

手动遍历 + contains() 去重——可控但低效

显式循环判断是否已存在,适合需要额外逻辑(如去重时记录重复次数、跳过特定条件元素)的场景,但时间复杂度为 O(n²),仅建议用于小数据量或教学演示。

容易踩的坑:ArrayList.contains() 在大数据量下非常慢;误用 == 替代 equals() 导致对象比较失效。

  • 若必须手动控制,优先用 HashSet 辅助判断(即边遍历边往 HashSet 放,用其 add() 返回值判断是否新增)
  • 避免在循环中直接修改正在遍历的集合(如 remove()),会触发 ConcurrentModificationException
  • 注意 null 元素:多数集合允许一个 null,但 TreeSet 等不支持

按业务规则去重(如只保留最新/最大值)不能靠基础集合类

HashSetdistinct() 只能做“存在性”去重,无法处理“保留某一个”的业务逻辑,比如相同 ID 的用户对象中只留更新时间最新的那个。

这时得结合 Collectors.toMap() 或分组聚合:

  • toMap(keyMapper, valueMapper, mergeFunction),其中 mergeFunction 决定冲突时留谁(如 (old, now) -> now 表示留新)
  • Collectors.groupingBy() 分组后再取每组的极值,适合需要统计或复杂筛选的场景
  • 注意 toMap 的 key 不能为 null,否则抛 NullPointerException

示例:

List<User> users = ...;<br>Map<Long, User> latestUserMap = users.stream()<br>    .collect(Collectors.toMap(<br>        User::getId,<br>        Function.identity(),<br>        (u1, u2) -> u1.getUpdateTime().isAfter(u2.getUpdateTime()) ? u1 : u2<br>    ));

实际去重时,真正麻烦的往往不是选哪个 API,而是没想清楚“重复”的定义——是字段全等?ID 相同?还是某个业务键一致?以及是否接受副作用(如修改原集合)、是否容忍 null、是否要兼容 JDK 7。这些细节比语法本身更容易导致线上问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

243

2023.09.22

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

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

705

2024.03.01

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

50

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

8

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

3

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

36

2026.02.12

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

276

2026.02.11

热门下载

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

精品课程

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

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.3万人学习

Java 教程
Java 教程

共578课时 | 64.1万人学习

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

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