java中Set接口常用方法详解
一、什么是 Set?
Set 是 Java 集合框架中的一个接口,它继承自 Collection,用于存储不重复的元素。
一句话概括 Set:
Set 是一个 不允许重复元素、通常不关心顺序 的集合。
Set 的核心特性(面试高频)
- 元素唯一性
- 不允许存储重复元素
- “重复”的判断依赖于
equals()(以及某些实现中的hashCode())
- 最多只存在一个 null
- 接口层面允许
null - 是否支持、支持几个,由具体实现决定(这里只记结论即可)
- 接口层面允许
- 无索引、不可通过下标访问
- 没有
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 的核心区别(接口层面对比)
| 维度 | Set | List |
|---|---|---|
| 是否允许重复 | ❌ 不允许 | ✅ 允许 |
| 是否有索引 | ❌ 无 | ✅ 有 |
| 访问方式 | 遍历 / contains | get(index) |
| 顺序语义 | 接口不保证 | 接口保证 |
| 适合场景 | 去重、判存在 | 有序存储、按位置访问 |
九、常见错误与注意事项
Set 不能用下标访问
set.get(0); // ❌ 编译错误
遍历时不能直接修改 Set
for (Integer x : set) { set.remove(x); // ❌ ConcurrentModificationException }判断存在用 contains,不要自己遍历
set.contains(a); // ✅ 语义清晰、效率更好
十、总结
关于 Set 接口,你至少要掌握:
- Set 是不允许重复元素的集合接口
- 不支持索引访问,只能遍历
- 泛型必须是引用类型(包装类)
- 判重依赖
equals() - 常用方法:
add / remove / contains / size - 遍历推荐增强 for,删除用 Iterator
- Set 的核心价值:去重 + 判存在
到此这篇关于java中Set接口常用方法详解的文章就介绍到这了,更多相关java Set接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud之LoadBalancer负载均衡服务调用过程
这篇文章主要介绍了SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2025-03-03
SpringBoot 使用AOP + Redis 防止表单重复提交的方法
Spring Boot是一个用于构建Web应用程序的框架,通过AOP可以实现防止表单重复提交,本文介绍了在Spring Boot应用程序中使用AOP和Redis来防止表单重复提交的方法,需要的朋友可以参考下2023-04-04
使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法
这篇文章主要介绍了使用Mybatis Generator结合Ant脚本快速自动生成Model、Mapper等文件的方法的相关资料,需要的朋友可以参考下2016-06-06
BeanDefinitionRegistryPostProcessor如何动态注册Bean到Spring
这篇文章主要介绍了BeanDefinitionRegistryPostProcessor如何动态注册Bean到Spring,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03


最新评论