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

相关推荐
颜酱1 小时前
二分图核心原理与判定算法
javascript·后端·算法
奋斗小强2 小时前
前端工程化:从 Webpack 到 Vite,打包速度提升 10 倍的秘密
后端
我叫黑大帅2 小时前
Golang中实时推送的功臣 - WebSocket
后端·面试·go
java1234_小锋2 小时前
Java高频面试题:JVM内存为什么要分代?
java·开发语言·jvm
筱砚.2 小时前
C++——lambda
开发语言·c++·算法
两个人的幸福online2 小时前
php开发者 需要 协程吗
android·开发语言·php
linux修理工2 小时前
下载亚马逊Corretto 17的方法(OpenJDK 17发行版)
java·运维·服务器
朱雨鹏2 小时前
图解RocketMQ运行原理
后端·rocketmq
颜颜颜yan_2 小时前
从千毫秒到亚毫秒:连接条件下推如何让复杂 SQL 飞起来
后端