java中Set接口常用方法詳解
一、什么是 Set?
Set 是 Java 集合框架中的一個(gè)接口,它繼承自 Collection,用于存儲(chǔ)不重復(fù)的元素。
一句話概括 Set:
Set 是一個(gè) 不允許重復(fù)元素、通常不關(guān)心順序 的集合。
Set 的核心特性(面試高頻)
- 元素唯一性
- 不允許存儲(chǔ)重復(fù)元素
- “重復(fù)”的判斷依賴于
equals()(以及某些實(shí)現(xiàn)中的hashCode())
- 最多只存在一個(gè) null
- 接口層面允許
null - 是否支持、支持幾個(gè),由具體實(shí)現(xiàn)決定(這里只記結(jié)論即可)
- 接口層面允許
- 無(wú)索引、不可通過下標(biāo)訪問
- 沒有
get(int index) - 只能通過迭代器或增強(qiáng) for 遍歷
- 沒有
二、Set 的基本使用方式
1. 聲明與創(chuàng)建
Set<Integer> set = new HashSet<>();
?? 注意:Set 是接口,不能直接 new Set()
三、Set 能存哪些數(shù)據(jù)類型?
1. 不能使用基本類型
Set 的泛型參數(shù) 必須是引用類型,不能是基本類型。
// ? 編譯錯(cuò)誤 Set<int> set = new HashSet<>();
2. 基本類型 → 包裝類型對(duì)照表(必背)
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<>(); // 自定義對(duì)象 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<>(); // 數(shù)組(?? 不推薦) Set<int[]> arraySet = new HashSet<>();
?? 數(shù)組作為 Set 元素時(shí),
equals()和hashCode()行為特殊,非常容易踩坑,實(shí)際開發(fā)中應(yīng)避免。
四、自動(dòng)裝箱與拆箱(Java 5+)
Set<Integer> set = new HashSet<>(); set.add(10); // 自動(dòng)裝箱:int → Integer int num = set.iterator().next(); // 自動(dòng)拆箱:Integer → int
面試中經(jīng)常會(huì)問:
為什么 Set 不能存 int,但可以 add(10)?
→ 因?yàn)榘l(fā)生了自動(dòng)裝箱。
五、Set 的常用方法(接口層面)
1. 添加元素
set.add(1); set.add(2);
- 如果元素已存在,
add()返回false - 不會(huì)拋異常,只是“加不進(jìn)去”
2. 判斷元素是否存在:contains
boolean exists = set.contains(a);
- 本質(zhì)語(yǔ)義:Set 中是否存在與 a 相等的元素
- 判斷依據(jù)是
equals()
?? 這是算法題和業(yè)務(wù)代碼中極其常用的方法
3. 刪除元素
set.remove(a);
- 刪除成功返回
true - 元素不存在返回
false
4. 獲取元素個(gè)數(shù)
int size = set.size();
5. 判空
set.isEmpty();
六、Set 的遍歷方式
1. 增強(qiáng) 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 中“不重復(fù)”的真正含義(面試重點(diǎn))
1. 什么叫“重復(fù)”?
Set 認(rèn)為兩個(gè)元素重復(fù),當(dāng)且僅當(dāng):
a.equals(b) == true
2. 對(duì)自定義對(duì)象尤其重要
Set<Person> set = new HashSet<>();
set.add(new Person("Tom", 18));
set.add(new Person("Tom", 18));
- 如果
Person沒有重寫 equals()- Set 會(huì)認(rèn)為這是兩個(gè)不同對(duì)象
- 接口語(yǔ)義層面:
Set 依賴 equals 來保證唯一性
?? 這是 Set 使用中最核心、最容易被問的問題之一
八、Set 與 List 的核心區(qū)別(接口層面對(duì)比)
| 維度 | Set | List |
|---|---|---|
| 是否允許重復(fù) | ? 不允許 | ? 允許 |
| 是否有索引 | ? 無(wú) | ? 有 |
| 訪問方式 | 遍歷 / contains | get(index) |
| 順序語(yǔ)義 | 接口不保證 | 接口保證 |
| 適合場(chǎng)景 | 去重、判存在 | 有序存儲(chǔ)、按位置訪問 |
九、常見錯(cuò)誤與注意事項(xiàng)
Set 不能用下標(biāo)訪問
set.get(0); // ? 編譯錯(cuò)誤
遍歷時(shí)不能直接修改 Set
for (Integer x : set) { set.remove(x); // ? ConcurrentModificationException }判斷存在用 contains,不要自己遍歷
set.contains(a); // ? 語(yǔ)義清晰、效率更好
十、總結(jié)
關(guān)于 Set 接口,你至少要掌握:
- Set 是不允許重復(fù)元素的集合接口
- 不支持索引訪問,只能遍歷
- 泛型必須是引用類型(包裝類)
- 判重依賴
equals() - 常用方法:
add / remove / contains / size - 遍歷推薦增強(qiáng) for,刪除用 Iterator
- Set 的核心價(jià)值:去重 + 判存在
到此這篇關(guān)于java中Set接口常用方法詳解的文章就介紹到這了,更多相關(guān)java Set接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis之關(guān)于動(dòng)態(tài)SQL解讀
這篇文章主要介紹了MyBatis之關(guān)于動(dòng)態(tài)SQL解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
springboot使用dynamic做多數(shù)據(jù)源配置全過程
文章介紹了如何使用dynamic依賴實(shí)現(xiàn)多數(shù)據(jù)源配置,并解決多數(shù)據(jù)源失效問題,通過配置yml文件、使用@DS注解指定數(shù)據(jù)源以及合理使用事務(wù)傳播機(jī)制,成功解決了項(xiàng)目中的多數(shù)據(jù)源問題2025-12-12
詳解spring boot使用@Retryable來進(jìn)行重處理
本篇文章主要介紹了詳解spring boot使用@Retryable來進(jìn)行重處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)
下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Java8新特性之lambda的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
我們期待了很久lambda為java帶來閉包的概念,但是如果我們不在集合中使用它的話,就損失了很大價(jià)值。現(xiàn)有接口遷移成為lambda風(fēng)格的問題已經(jīng)通過default methods解決了,在這篇文章將深入解析Java集合里面的批量數(shù)據(jù)操作解開lambda最強(qiáng)作用的神秘面紗。2017-06-06
SpringBoot中@MessageMapping注解的原理及使用詳解
這篇文章主要介紹了SpringBoot中@MessageMapping注解的原理及使用詳解,@MessageMapping注解是Spring Boot提供的一個(gè)重要的注解之一,它可以幫助我們處理WebSocket消息,需要的朋友可以參考下2023-07-07

