java中Set接口常用方法详解

 更新时间:2026年03月17日 09:53:30   作者:6+h  
在Java编程中Set接口是集合框架的一部分,它继承自Collection接口,主要用于存储不包含重复元素的集合,这篇文章主要介绍了java中Set接口常用方法的相关资料,需要的朋友可以参考下

一、什么是 Set?

Set 是 Java 集合框架中的一个接口,它继承自 Collection,用于存储不重复的元素

一句话概括 Set:

Set 是一个 不允许重复元素、通常不关心顺序 的集合。

Set 的核心特性(面试高频)

  1. 元素唯一性
    • 不允许存储重复元素
    • “重复”的判断依赖于 equals()(以及某些实现中的 hashCode()
  2. 最多只存在一个 null
    • 接口层面允许 null
    • 是否支持、支持几个,由具体实现决定(这里只记结论即可)
  3. 无索引、不可通过下标访问
    • 没有 get(int index)
    • 只能通过迭代器或增强 for 遍历

二、Set 的基本使用方式

1. 声明与创建

Set<Integer> set = new HashSet<>();

⚠️ 注意:Set 是接口,不能直接 new Set()

三、Set 能存哪些数据类型?

1. 不能使用基本类型

Set 的泛型参数 必须是引用类型,不能是基本类型。

// ❌ 编译错误
Set<int> set = new HashSet<>();

2. 基本类型 → 包装类型对照表(必背)

int     → Integer
char    → Character
boolean → Boolean
byte    → Byte
short   → Short
long    → Long
float   → Float
double  → Double

3. 常见可用类型示例

// 包装类型
Set<Integer> intSet = new HashSet<>();
Set<Character> charSet = new HashSet<>();

// 字符串
Set<String> strSet = new HashSet<>();

// 自定义对象
Set<MyClass> objSet = new HashSet<>();

// 集合类型
Set<List<String>> listSet = new HashSet<>();
Set<Set<Integer>> setOfSets = new HashSet<>();

4. 特殊但合法的类型

// 枚举
Set<DayOfWeek> enumSet = new HashSet<>();

// 接口
Set<Runnable> interfaceSet = new HashSet<>();

// 数组(⚠️ 不推荐)
Set<int[]> arraySet = new HashSet<>();

⚠️ 数组作为 Set 元素时,equals()hashCode() 行为特殊,非常容易踩坑,实际开发中应避免。

四、自动装箱与拆箱(Java 5+)

Set<Integer> set = new HashSet<>();

set.add(10);           // 自动装箱:int → Integer
int num = set.iterator().next(); // 自动拆箱:Integer → int

面试中经常会问:
为什么 Set 不能存 int,但可以 add(10)?
→ 因为发生了自动装箱。

五、Set 的常用方法(接口层面)

1. 添加元素

set.add(1);
set.add(2);
  • 如果元素已存在,add() 返回 false
  • 不会抛异常,只是“加不进去”

2. 判断元素是否存在:contains

boolean exists = set.contains(a);
  • 本质语义:Set 中是否存在与 a 相等的元素
  • 判断依据是 equals()

📌 这是算法题和业务代码中极其常用的方法

3. 删除元素

set.remove(a);
  • 删除成功返回 true
  • 元素不存在返回 false

4. 获取元素个数

int size = set.size();

5. 判空

set.isEmpty();

六、Set 的遍历方式

1. 增强 for(最常用)

for (Integer x : set) {
    System.out.println(x);
}
  • 底层仍然是 Iterator
  • 遍历过程中不能修改 Set

2. Iterator 遍历(可安全删除)

Iterator<Integer> it = set.iterator();
while (it.hasNext()) {
    Integer x = it.next();
    if (x == 10) {
        it.remove(); // 唯一安全删除方式
    }
}

七、Set 中“不重复”的真正含义(面试重点)

1. 什么叫“重复”?

Set 认为两个元素重复,当且仅当:

a.equals(b) == true

2. 对自定义对象尤其重要

Set<Person> set = new HashSet<>();
set.add(new Person("Tom", 18));
set.add(new Person("Tom", 18));
  • 如果 Person 没有重写 equals()
    • Set 会认为这是两个不同对象
  • 接口语义层面:
    Set 依赖 equals 来保证唯一性

⚠️ 这是 Set 使用中最核心、最容易被问的问题之一

八、Set 与 List 的核心区别(接口层面对比)

维度SetList
是否允许重复❌ 不允许✅ 允许
是否有索引❌ 无✅ 有
访问方式遍历 / containsget(index)
顺序语义接口不保证接口保证
适合场景去重、判存在有序存储、按位置访问

九、常见错误与注意事项

  1. Set 不能用下标访问

    set.get(0); // ❌ 编译错误
    
  2. 遍历时不能直接修改 Set

    for (Integer x : set) {
        set.remove(x); // ❌ ConcurrentModificationException
    }
    
  3. 判断存在用 contains,不要自己遍历

    set.contains(a); // ✅ 语义清晰、效率更好
    

十、总结

关于 Set 接口,你至少要掌握:

  1. Set 是不允许重复元素的集合接口
  2. 不支持索引访问,只能遍历
  3. 泛型必须是引用类型(包装类)
  4. 判重依赖 equals()
  5. 常用方法:add / remove / contains / size
  6. 遍历推荐增强 for,删除用 Iterator
  7. Set 的核心价值:去重 + 判存在

到此这篇关于java中Set接口常用方法详解的文章就介绍到这了,更多相关java Set接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的synchronized锁膨胀详解

    Java中的synchronized锁膨胀详解

    这篇文章主要介绍了Java中的synchronized锁膨胀详解,正常创建的对象,状态为无锁,对象头的Mark Word 中主要记录了 对象的年龄,也就是经历了多少次GC还存活下来,需要的朋友可以参考下
    2024-01-01
  • MyBatis之关于动态SQL解读

    MyBatis之关于动态SQL解读

    这篇文章主要介绍了MyBatis之关于动态SQL解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • springboot使用dynamic做多数据源配置全过程

    springboot使用dynamic做多数据源配置全过程

    文章介绍了如何使用dynamic依赖实现多数据源配置,并解决多数据源失效问题,通过配置yml文件、使用@DS注解指定数据源以及合理使用事务传播机制,成功解决了项目中的多数据源问题
    2025-12-12
  • 详解spring boot使用@Retryable来进行重处理

    详解spring boot使用@Retryable来进行重处理

    本篇文章主要介绍了详解spring boot使用@Retryable来进行重处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java中BigDecimal的基本运算(详解)

    Java中BigDecimal的基本运算(详解)

    下面小编就为大家带来一篇Java中BigDecimal的基本运算(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 详解Feign的实现原理

    详解Feign的实现原理

    Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API
    2021-06-06
  • jstl标签基础开发步骤(详解)

    jstl标签基础开发步骤(详解)

    下面小编就为大家带来一篇jstl标签基础开发步骤(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 关于Java反射机制 你需要知道的事情

    关于Java反射机制 你需要知道的事情

    这篇文章主要介绍了Java反射机制的相关内容,涉及了class类的动态加载,获取成员变量、构造函数信息等信息,需要的朋友可以参考下。
    2017-09-09
  • Java8新特性之lambda的作用_动力节点Java学院整理

    Java8新特性之lambda的作用_动力节点Java学院整理

    我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作解开lambda最强作用的神秘面纱。
    2017-06-06
  • SpringBoot中@MessageMapping注解的原理及使用详解

    SpringBoot中@MessageMapping注解的原理及使用详解

    这篇文章主要介绍了SpringBoot中@MessageMapping注解的原理及使用详解,@MessageMapping注解是Spring Boot提供的一个重要的注解之一,它可以帮助我们处理WebSocket消息,需要的朋友可以参考下
    2023-07-07

最新评论