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 list = Arrays.asList("a", "b", "a", "c");
Set uniqueSet = new HashSet<>(list); // 结果:[a, b, c],顺序不确定

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

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

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

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

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

示例:

List nums = Arrays.asList(1, 2, 2, 3, 1);
List 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 users = ...;
Map latestUserMap = users.stream()
.collect(Collectors.toMap(
User::getId,
Function.identity(),
(u1, u2) -> u1.getUpdateTime().isAfter(u2.getUpdateTime()) ? u1 : u2
));

实际去重时,真正麻烦的往往不是选哪个 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的相关内容,可以阅读本专题下面的文章。

685

2024.03.01

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

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

54

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

154

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

37

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

4

2026.02.11

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

5

2026.02.11

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

156

2026.02.10

热门下载

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

精品课程

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

共23课时 | 3.5万人学习

C# 教程
C# 教程

共94课时 | 9.2万人学习

Java 教程
Java 教程

共578课时 | 63.4万人学习

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

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