我们经常会遇到类似这样的场景:
有一堆文章标题,你希望去掉重复的,想记录一批用户 ID,确保每个用户唯一,想统计单词出现次数,但不关心顺序;
如果你还在用 ArrayList + 遍历去重,恭喜,你离"低效率"不远了。
在 Java 中,有一个集合专门为你解决这些问题,它叫 Set。今天,我就用生动的方式带你深入了解 Set,让它成为你最得力的小助手。
什么是 Set?
Set 是 Java 集合框架(Collection Framework)中的接口,其核心特点是:
-
元素唯一:不能有重复元素
-
没有索引:不像 List 可以通过下标访问
-
可存对象:可以存自定义对象
-
常用实现类:
-
HashSet:无序,查找快
-
LinkedHashSet:保留插入顺序
-
TreeSet:自动排序
-
生活比喻:Set 就像一个智能抽屉,你放东西之前,它会先检查抽屉里有没有相同的东西,如果有,它会拒绝重复放入。
Set 的趣味应用场景
-
去重文章标题
-
统计唯一用户 ID
-
活动报名保证每人只有一次记录
-
统计文章里出现过的单词
想象你是咖啡店老板,每个顾客都有会员号。
HashSet → 快速记录会员号,不重复
LinkedHashSet → 按顾客进店顺序排队
TreeSet → 按会员号排序,自动生成排行榜
HashSet:
java
import java.util.HashSet;
public class Demo {
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("C++");
set.add("Java"); // 重复,自动忽略
System.out.println(set);
}
}
输出:
C++, Python, Java
你看,重复元素自动消失了,就像魔法一样。
LinkedHashSet:顺序守护者
java
import java.util.LinkedHashSet;
LinkedHashSet<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("Java");
linkedSet.add("Python");
linkedSet.add("C++");
linkedSet.add("Java"); // 重复元素被拒绝
System.out.println(linkedSet);
输出:
Java, Python, C++
它不仅去重,还帮你记住谁先来,让顺序不乱
TreeSet:自动排队
java
import java.util.TreeSet;
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(5);
treeSet.add(3);
treeSet.add(7);
treeSet.add(5); // 重复被忽略
System.out.println(treeSet);
输出:
3, 5, 7
自动排序,去重还排好队,省时省力,非常适合做成绩榜、排行榜。
Set 遍历:轻松读取内容
java
for(String s : linkedSet){
System.out.println(s);
}
// 或 Java 8 Lambda
linkedSet.forEach(System.out::println);
Set 存自定义对象
java
class Article {
int id;
String title;
public Article(int id, String title){
this.id = id;
this.title = title;
}
@Override
public int hashCode(){ return id; }
@Override
public boolean equals(Object obj){
if(!(obj instanceof Article)) return false;
return this.id == ((Article)obj).id;
}
}
HashSet<Article> articles = new HashSet<>();
articles.add(new Article(1,"Java基础"));
articles.add(new Article(2,"HashSet实战"));
articles.add(new Article(1,"Java基础")); // 重复对象不会加入
哈希值就像身份证,Set 用它确认对象唯一性。
Set 的常用方法
| 方法 | 功能 |
|---|
|----------|--------------|
| add(E e) | 添加元素,重复元素不加入 |
|-------------|------|
| remove(E e) | 删除元素 |
|---------------|----------|
| contains(E e) | 判断元素是否存在 |
|--------|--------|
| size() | 获取集合大小 |
|-----------|----------|
| isEmpty() | 判断集合是否为空 |
|---------|------|
| clear() | 清空集合 |
|-----------|------|
| forEach() | 遍历元素 |
HashSet 去重快速,LinkedHashSet 保留顺序,TreeSet 自动排序