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

相关推荐
Lost of 程序猿1 分钟前
M2 实战:询价与采购订单聚合落地——跨聚合一致性、领域事件与 Outbox
开发语言·c#·asp.net·.net
速易达网络3 分钟前
用 Three.js 打造一座会呼吸的海岛:海风之屿飞艇巡航的技术实现
开发语言·javascript·ecmascript
yujunl10 分钟前
U9 BE插件的调试
开发语言
青山木12 分钟前
Hot 100 --- 打家劫舍
java·数据结构·算法·leetcode·动态规划
敲代码的嘎仔16 分钟前
28届后端开发-百人小厂面试题
java·后端·面试·程序员·秋招·实习·转正
牛油果子哥q17 分钟前
多模态大模型工程入门:图文Embedding、图文RAG、图片解析、C++多模态接口封装实战
开发语言·c++·embedding
Bs_MoneyMagnet22 分钟前
基于springboot+vue的爱心众筹系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·管理系统
AIFQuant25 分钟前
Python股票实时价格告警系统:WebSocket订阅与REST快照实战
开发语言·python·websocket·a股行情
wuyk55535 分钟前
从零吃透 MQTT 通信|第 10 章 阿里云 / 腾讯云 MQTT 设备完整对接实战,三元组、签名、设备上云调试
c语言·开发语言·stm32·学习·阿里云·云计算·腾讯云
名字还没想好☜36 分钟前
Java Collectors.groupingBy 进阶:多级分组、下游收集器与统计聚合一次搞定
java·windows·后端·python·spring