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

在Java里如何使用Set集合去除重复元素_Java去重操作解析

雨宇君_4289

雨宇君_4289

发布时间:2026-01-24 13:41:02

|

727人浏览过

|

来源于php中文网

原创

HashSet去重失败的根本原因是对象未正确重写equals()和hashCode();LinkedHashSet可保持插入顺序去重;distinct()依赖equals/hashCode且不支持字段级去重;SQL层去重优先于Java层。

在java里如何使用set集合去除重复元素_java去重操作解析

为什么直接用 HashSet 有时去重失败?

根本原因不是 HashSet 不行,而是你存的对象没正确重写 equals() 和 hashCode()。比如用自定义类 User 存进 HashSet,但没重写这两个方法,那两个字段完全相同的 User 实例仍会被视为不同元素——因为默认比较的是内存地址。

  • 只重写 equals() 不重写 hashCode():违反哈希契约,可能导致元素“消失”(contains() 返回 false,但实际存在)
  • 字段参与比较的,必须全部出现在 hashCode() 计算中(推荐用 Objects.hash(...))
  • 使用 Lombok 的话,加 @EqualsAndHashCode 注解最省事,但要确认 exclude 或 of 指定的字段符合业务去重逻辑

如何对 List 快速去重并保持插入顺序?

用 LinkedHashSet 是最直接的方式:它既具备 HashSet 的去重能力,又通过链表维护插入顺序。

List<String> original = Arrays.asList("a", "b", "a", "c");
List<String> unique = new ArrayList<>(new LinkedHashSet<>(original));
  • 注意:构造 LinkedHashSet 时传入原 List,会按遍历顺序去重;不能反过来先建空集再 addAll(),否则顺序可能错乱
  • 如果原 List 很大(比如百万级),这种写法会额外分配一次内存;可考虑用 Stream + Collectors.toCollection(LinkedHashSet::new) 避免中间 List
  • TreeSet 虽然也能去重,但会按自然序或自定义序排序,不保证原始顺序

Stream API 去重时 distinct() 的限制在哪?

distinct() 内部依赖元素的 equals()/hashCode(),和 HashSet 行为一致——所以同样要求对象正确实现这两个方法。它不支持按指定字段去重(比如只看 id 字段)。

  • 想按单个字段去重?得自己写 filter() + 状态容器,例如:
    Set<Long> seenIds = ConcurrentHashMap.newKeySet();
    list.stream()
        .filter(item -> seenIds.add(item.getId()))
        .collect(Collectors.toList());
  • 用 Collectors.toMap() 可实现更灵活的去重逻辑(如保留最新/最早元素),但要注意键冲突时的合并函数
  • distinct() 是有状态操作,不能并行流里随意用——虽然它内部做了线程安全处理,但并行下顺序不保证,且性能未必优于单线程

数据库查出来的 List 去重,该在 Java 层还是 SQL 层做?

优先在 SQL 层用 DISTINCT 或 GROUP BY。Java 层去重是兜底手段,不是首选。

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

  • SQL 去重能减少网络传输量、降低 JVM 堆压力,尤其当结果集含大量重复且字段多时
  • 如果去重要求复杂(比如“相同 name 下取 created_time 最大的那条”),SQL 用 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 更可靠
  • Java 层去重容易掩盖数据一致性问题:比如同名用户本应有唯一 ID,但 DB 里因 bug 出现了两条,Java 层一去重反而让问题更难被发现

真正需要 Java 层去重的场景,往往是多个异构数据源合并后统一清洗,或者业务规则无法用 SQL 表达(比如基于外部服务返回值判断是否重复)。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

豆包大模型

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4383

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

911

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1149

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6321

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3143

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6300

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8561

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1170

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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