【Java集合通关秘籍】从List到Set:解锁无序不重复的集合魔法✨

哈喽各位小伙伴👋!昨天咱们聊了List接口(有序、可重复、带下标),解决了数组长度固定、增删麻烦的痛点,但实际开发中,我们经常遇到"去重"的刚需------比如统计签到的唯一用户、筛选订单里的唯一商品ID、去重手机号列表...这时候List就不够用了,今天咱们就聚焦集合家族里的"去重担当"------Set接口,解锁它的三大核心实现类:HashSet、LinkedHashSet、TreeSet!

一、先唠唠:为啥非要用集合?

在聊Set之前,先快速回顾下集合的"诞生初心":

复制代码

而集合就是为了解决这些问题来的:长度动态可变、增删改查自带方法、不同集合适配不同业务场景(List有序、Set去重、Map键值对)。

二、集合家族速览:List只是前菜,Set才是去重主力

先看一眼集合的体系结构(昨天详聊List,今天一笔带过):

复制代码

核心区别:List是"按顺序排好队的盒子",Set是"只装独一无二物品的魔法袋"🧰。

三、Set接口:不重复的"铁律"

Set是Collection的子接口,方法和Collection完全一致(没有List的下标相关方法),核心特性就两个:

  1. 不可重复:往Set里加重复元素,会直接"静默失败"(不报错,但加不进去);

  2. 无序:默认不保证元素的存储/取出顺序(LinkedHashSet除外)。

Set的核心方法(和Collection通用,简单列几个高频的):

复制代码

四、Set三子登科:HashSet/LinkedHashSet/TreeSet

光有接口不够,咱们重点看三个"干活的"实现类,用代码说话👇

1. HashSet:速度最快的"去重神器"

  • 底层 :哈希表(数组+链表/红黑树),依赖元素的hashCode()equals()保证唯一性;

  • 特点:查询/增删速度贼快、无序、允许存null(但只能存一个);

  • 核心 :自定义类用HashSet去重,必须重写hashCode()equals()

复制代码

2. LinkedHashSet:有"记忆"的HashSet

  • 底层:哈希表+双向链表,既保留HashSet的去重特性,又记录元素的"插入顺序";

  • 特点:有序(按插入顺序)、去重、速度略慢于HashSet;

  • 适用场景:既要去重,又要保证顺序(比如记录用户操作日志,去重且保留操作顺序)。

复制代码

3. TreeSet:自带排序的"去重王者"

  • 底层:红黑树(一种平衡二叉树),会自动对元素排序;

  • 特点:去重+排序、无下标、不允许存null;

  • 排序规则

    • 基本数据类型(Integer、String):默认自然排序(数字升序、字符串字典序);

    • 自定义类:需实现Comparable接口,重写compareTo()方法指定排序规则。

复制代码

五、实战小场景:用Set解决"去重+排序"

需求:统计用户输入的10个数字,去重并按升序输出。

复制代码

输入:5 3 8 3 9 5 1 7 8 2

输出:去重并排序后的数字:[1, 2, 3, 5, 7, 8, 9]

🌟 总结

  1. Set的核心价值是去重,无下标、默认无序(LinkedHashSet除外);

  2. 选Set看场景:追求速度用HashSet,要顺序用LinkedHashSet,要排序用TreeSet;

  3. 自定义类用HashSet/LinkedHashSet需重写hashCode()+equals(),用TreeSet需实现Comparable接口。

今天的Set就聊到这~评论区聊聊你平时用Set踩过哪些坑?比如忘记重写hashCode导致去重失败?😜


💡 往期回顾:《Java集合通关秘籍:List接口详解(ArrayList/LinkedList)》

相关推荐
辰海Coding几秒前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
念何架构之路2 分钟前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星4 分钟前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路7 分钟前
C++ 多线程与并发
java·jvm·c++
审判长烧鸡9 分钟前
【Go工具】go-playground是什么组织?官方的?
开发语言·安全·go
失去的青春---夕阳下的奔跑9 分钟前
560. 和为 K 的子数组
数据结构·算法·leetcode
AI视觉网奇12 分钟前
linux 检索库 判断库是否支持
java·linux·服务器
kkeeper~35 分钟前
0基础C语言积跬步之字符函数与字符串函数(上)
c语言·开发语言
黎阳之光40 分钟前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
她的男孩42 分钟前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构