Set 深度解析:去重、唯一性与你的智能抽屉

我们经常会遇到类似这样的场景:

有一堆文章标题,你希望去掉重复的,想记录一批用户 ID,确保每个用户唯一,想统计单词出现次数,但不关心顺序;

如果你还在用 ArrayList + 遍历去重,恭喜,你离"低效率"不远了。

在 Java 中,有一个集合专门为你解决这些问题,它叫 Set。今天,我就用生动的方式带你深入了解 Set,让它成为你最得力的小助手。

什么是 Set?

Set 是 Java 集合框架(Collection Framework)中的接口,其核心特点是:

  1. 元素唯一:不能有重复元素

  2. 没有索引:不像 List 可以通过下标访问

  3. 可存对象:可以存自定义对象

  4. 常用实现类:

    • HashSet:无序,查找快

    • LinkedHashSet:保留插入顺序

    • TreeSet:自动排序

生活比喻:Set 就像一个智能抽屉,你放东西之前,它会先检查抽屉里有没有相同的东西,如果有,它会拒绝重复放入。

Set 的趣味应用场景

  1. 去重文章标题

  2. 统计唯一用户 ID

  3. 活动报名保证每人只有一次记录

  4. 统计文章里出现过的单词

想象你是咖啡店老板,每个顾客都有会员号。

  • 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 自动排序

相关推荐
YOLO数据集集合4 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
hsfxuebao4 小时前
Loop Engineering 保姆级教程 + 项目实战
人工智能·后端
知行EDI4 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记4 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI4 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
架构技术专栏5 小时前
交叉熵:AI 怎样给概率预测打分
后端
殷色玫瑰5 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
知识分享小能手6 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
IT_陈寒6 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
青山木6 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划