最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Set接口常用方法詳解

 更新時(shí)間:2026年03月17日 09:53:30   作者:6+h  
在Java編程中Set接口是集合框架的一部分,它繼承自Collection接口,主要用于存儲(chǔ)不包含重復(fù)元素的集合,這篇文章主要介紹了java中Set接口常用方法的相關(guān)資料,需要的朋友可以參考下

一、什么是 Set?

Set 是 Java 集合框架中的一個(gè)接口,它繼承自 Collection,用于存儲(chǔ)不重復(fù)的元素。

一句話概括 Set:

Set 是一個(gè) 不允許重復(fù)元素、通常不關(guān)心順序 的集合。

Set 的核心特性(面試高頻)

  1. 元素唯一性
    • 不允許存儲(chǔ)重復(fù)元素
    • “重復(fù)”的判斷依賴于 equals()(以及某些實(shí)現(xiàn)中的 hashCode()
  2. 最多只存在一個(gè) null
    • 接口層面允許 null
    • 是否支持、支持幾個(gè),由具體實(shí)現(xiàn)決定(這里只記結(jié)論即可)
  3. 無(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ì)比)

維度SetList
是否允許重復(fù)? 不允許? 允許
是否有索引? 無(wú)? 有
訪問方式遍歷 / containsget(index)
順序語(yǔ)義接口不保證接口保證
適合場(chǎng)景去重、判存在有序存儲(chǔ)、按位置訪問

九、常見錯(cuò)誤與注意事項(xiàng)

  1. Set 不能用下標(biāo)訪問

    set.get(0); // ? 編譯錯(cuò)誤
    
  2. 遍歷時(shí)不能直接修改 Set

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

    set.contains(a); // ? 語(yǔ)義清晰、效率更好
    

十、總結(jié)

關(guān)于 Set 接口,你至少要掌握:

  1. Set 是不允許重復(fù)元素的集合接口
  2. 不支持索引訪問,只能遍歷
  3. 泛型必須是引用類型(包裝類)
  4. 判重依賴 equals()
  5. 常用方法:add / remove / contains / size
  6. 遍歷推薦增強(qiáng) for,刪除用 Iterator
  7. Set 的核心價(jià)值:去重 + 判存在

到此這篇關(guān)于java中Set接口常用方法詳解的文章就介紹到這了,更多相關(guān)java Set接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的synchronized鎖膨脹詳解

    Java中的synchronized鎖膨脹詳解

    這篇文章主要介紹了Java中的synchronized鎖膨脹詳解,正常創(chuàng)建的對(duì)象,狀態(tài)為無(wú)鎖,對(duì)象頭的Mark?Word?中主要記錄了?對(duì)象的年齡,也就是經(jīng)歷了多少次GC還存活下來,需要的朋友可以參考下
    2024-01-01
  • MyBatis之關(guān)于動(dòng)態(tài)SQL解讀

    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ù)源配置全過程

    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)行重處理

    本篇文章主要介紹了詳解spring boot使用@Retryable來進(jìn)行重處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java中BigDecimal的基本運(yùn)算(詳解)

    Java中BigDecimal的基本運(yùn)算(詳解)

    下面小編就為大家?guī)硪黄狫ava中BigDecimal的基本運(yùn)算(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • 詳解Feign的實(shí)現(xiàn)原理

    詳解Feign的實(shí)現(xiàn)原理

    Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP API
    2021-06-06
  • jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)

    jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)

    下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 關(guān)于Java反射機(jī)制 你需要知道的事情

    關(guān)于Java反射機(jī)制 你需要知道的事情

    這篇文章主要介紹了Java反射機(jī)制的相關(guān)內(nèi)容,涉及了class類的動(dòng)態(tài)加載,獲取成員變量、構(gòu)造函數(shù)信息等信息,需要的朋友可以參考下。
    2017-09-09
  • Java8新特性之lambda的作用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    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注解的原理及使用詳解

    這篇文章主要介紹了SpringBoot中@MessageMapping注解的原理及使用詳解,@MessageMapping注解是Spring Boot提供的一個(gè)重要的注解之一,它可以幫助我們處理WebSocket消息,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

阿坝县| 长治县| 峡江县| 泰州市| 新泰市| 玉屏| 涞水县| 吉水县| 荃湾区| 图们市| 滦平县| 朝阳市| 社会| 崇阳县| 两当县| 龙陵县| 青田县| 湖北省| 长寿区| 哈密市| 翁牛特旗| 慈溪市| 祁门县| 望都县| 台北县| 贺兰县| 巴青县| 昔阳县| 阿合奇县| 镇雄县| 广饶县| 延长县| 水富县| 连州市| 嘉义县| 玉屏| 吉林市| 资阳市| 乌鲁木齐市| 油尖旺区| 申扎县|