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

Java集合Set的簡單使用解析

 更新時(shí)間:2023年11月29日 10:29:41   作者:時(shí)代&信念  
這篇文章主要介紹了Java集合Set的簡單使用解析,Set接口是Collection的子接口,Set接口相較于Collection接口沒有提供額外的方法,Set 集合不允許包含相同的元素,如果試把兩個(gè)相同的元素加入同一個(gè) Set 集合中,則添加操作失敗,需要的朋友可以參考下

Set的簡單介紹

  • Set接口是Collection的子接口,Set接口相較于Collection接口沒有提供額外的方法。
  • Set 集合不允許包含相同的元素,如果試把兩個(gè)相同的元素加入同一個(gè) Set 集合中,則添加操作失敗。
  • Set集合支持的遍歷方式和Collection集合一樣:foreach和Iterator。
  • Set的常用實(shí)現(xiàn)類有:HashSet、TreeSet、LinkedHashSet。

Set主要實(shí)現(xiàn)類:HashSet

HashSet概述

  • HashSet 是 Set 接口的主要實(shí)現(xiàn)類,大多數(shù)時(shí)候使用 Set 集合時(shí)都使用這個(gè)實(shí)現(xiàn)類。
  • HashSet 按 Hash 算法來存儲集合中的元素,因此具有很好的存儲、查找、刪除性能。
  • HashSet 具有以下特點(diǎn):
    • 不能保證元素的排列順序
    • HashSet 不是線程安全的
    • 集合元素可以是 null

- HashSet 集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn):兩個(gè)對象通過 hashCode() 方法得到的哈希值相等,并且兩個(gè)對象的 equals() 方法返回值為true。

  • 對于存放在Set容器中的對象,對應(yīng)的類一定要重寫hashCode()和equals(Object obj)方法,以實(shí)現(xiàn)對象相等規(guī)則。即:“相等的對象必須具有相等的hash散列碼”。
  • HashSet集合中元素的無序性,不等同于隨機(jī)性。這里的無序性與元素的添加位置有關(guān)。具體來說:我們在添加每一個(gè)元素到數(shù)組中時(shí),具體的存儲位置是由元素的hashCode()調(diào)用后返回的hash值決定的。導(dǎo)致在數(shù)組中每個(gè)元素不是依次緊密存放的,表現(xiàn)出一定的無序性。

HashSet中添加元素的過程

第1步:當(dāng)向 HashSet 集合中存入一個(gè)元素時(shí),HashSet 會調(diào)用該對象的 hashCode() 方法得到該對象的 hashCode值,然后根據(jù) hashCode值,通過某個(gè)散列函數(shù)決定該對象在 HashSet 底層數(shù)組中的存儲位置。

第2步:如果要在數(shù)組中存儲的位置上沒有元素,則直接添加成功。

第3步:如果要在數(shù)組中存儲的位置上有元素,則繼續(xù)比較:

  • 如果兩個(gè)元素的hashCode值不相等,則添加成功;(hashCode值不相等,兩個(gè)元素必不相同)
  • 如果兩個(gè)元素的hashCode()值相等,則會繼續(xù)調(diào)用equals()方法:
    • 如果equals()方法結(jié)果為false,則添加成功。
    • 如果equals()方法結(jié)果為true,則添加失敗。

第2步添加成功,元素會保存在底層數(shù)組中。

第3步兩種添加成功的操作,由于該底層數(shù)組的位置已經(jīng)有元素了,則會通過鏈表的方式繼續(xù)鏈接,存儲。

在這里插入圖片描述

重寫 hashCode() 方法的基本原則

  • 在程序運(yùn)行時(shí),同一個(gè)對象多次調(diào)用 hashCode() 方法應(yīng)該返回相同的值。
  • 當(dāng)兩個(gè)對象的 equals() 方法比較返回 true 時(shí),這兩個(gè)對象的 hashCode() 方法的返回值也應(yīng)相等。
  • 對象中用作 equals() 方法比較的 Field,都應(yīng)該用來計(jì)算 hashCode 值。

注意:如果兩個(gè)元素的 equals() 方法返回 true,但它們的 hashCode() 返回值不相等,hashSet 將會把它們存儲在不同的位置,但依然可以添加成功。(這是經(jīng)典的錯(cuò)誤,標(biāo)準(zhǔn)的零分)

重寫equals()方法的基本原則

重寫equals方法的時(shí)候一般都需要同時(shí)復(fù)寫hashCode方法。通常參與計(jì)算hashCode的對象的屬性也應(yīng)該參與到equals()中進(jìn)行計(jì)算。

推薦:開發(fā)中直接調(diào)用Eclipse/IDEA里的快捷鍵自動(dòng)重寫equals()和hashCode()方法即可。

Set實(shí)現(xiàn)類之二:LinkedHashSet

LinkedHashSet 是 HashSet 的子類,不允許集合元素重復(fù)。

LinkedHashSet 根據(jù)元素的 hashCode 值來決定元素的存儲位置,但它同時(shí)使用雙向鏈表維護(hù)元素的次序,這使得元素看起來是以添加順序保存的。

LinkedHashSet插入性能略低于 HashSet,但在迭代訪問 Set 里的全部元素時(shí)有很好的性能。

在這里插入圖片描述

Set實(shí)現(xiàn)類之三:TreeSet

  • TreeSet 是 SortedSet 接口的實(shí)現(xiàn)類,TreeSet 可以按照添加的元素的指定的屬性的大小順序進(jìn)行遍歷。
  • TreeSet底層使用紅黑樹結(jié)構(gòu)存儲數(shù)據(jù)

新增的方法如下: (了解)

  • Comparator comparator()
  • Object first()
  • Object last()
  • Object lower(Object e)
  • Object higher(Object e)
  • SortedSet subSet(fromElement, toElement)
  • SortedSet headSet(toElement)
  • SortedSet tailSet(fromElement)

TreeSet特點(diǎn):不允許重復(fù)、實(shí)現(xiàn)排序(自然排序或定制排序)

  • TreeSet 兩種排序方法:自然排序和定制排序。默認(rèn)情況下,TreeSet 采用自然排序。

自然排序:TreeSet 會調(diào)用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關(guān)系,然后將集合元素按升序(默認(rèn)情況)排列。

如果試圖把一個(gè)對象添加到 TreeSet 時(shí),則該對象的類必須實(shí)現(xiàn) Comparable 接口。

實(shí)現(xiàn) Comparable 的類必須實(shí)現(xiàn) compareTo(Object obj) 方法,兩個(gè)對象即通過 compareTo(Object obj) 方法的返回值來比較大小。

定制排序:如果元素所屬的類沒有實(shí)現(xiàn)Comparable接口,或不希望按照升序(默認(rèn)情況)的方式排列元素或希望按照其它屬性大小進(jìn)行排序,則考慮使用定制排序。定制排序,通過Comparator接口來實(shí)現(xiàn)。需要重寫compare(T o1,T o2)方法。

利用int compare(T o1,T o2)方法,比較o1和o2的大?。喝绻椒ǚ祷卣麛?shù),則表示o1大于o2;如果返回0,表示相等;返回負(fù)整數(shù),表示o1小于o2。

要實(shí)現(xiàn)定制排序,需要將實(shí)現(xiàn)Comparator接口的實(shí)例作為形參傳遞給TreeSet的構(gòu)造器。

因?yàn)橹挥邢嗤惖膬蓚€(gè)實(shí)例才會比較大小,所以向 TreeSet 中添加的應(yīng)該是同一個(gè)類的對象。

對于 TreeSet 集合而言,它判斷兩個(gè)對象是否相等的唯一標(biāo)準(zhǔn)是:兩個(gè)對象通過 compareTo(Object obj) 或compare(Object o1,Object o2)方法比較返回值。返回值為0,則認(rèn)為兩個(gè)對象相等。

到此這篇關(guān)于Java集合Set的簡單使用解析的文章就介紹到這了,更多相關(guān)Set的簡單使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java8中的default關(guān)鍵字詳解

    Java8中的default關(guān)鍵字詳解

    這篇文章主要介紹了Java8中的default關(guān)鍵字詳解,在實(shí)現(xiàn)某個(gè)接口的時(shí)候,需要實(shí)現(xiàn)該接口所有的方法,這個(gè)時(shí)候default關(guān)鍵字就派上用場了。通過default關(guān)鍵字定義的方法,集成該接口的方法不需要去實(shí)現(xiàn)該方法,需要的朋友可以參考下
    2023-08-08
  • 解決spring @ControllerAdvice處理異常無法正確匹配自定義異常

    解決spring @ControllerAdvice處理異常無法正確匹配自定義異常

    這篇文章主要介紹了解決spring @ControllerAdvice處理異常無法正確匹配自定義異常的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot項(xiàng)目中使用AOP的方法

    SpringBoot項(xiàng)目中使用AOP的方法

    本篇文章主要介紹了SpringBoot項(xiàng)目中使用AOP的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 圖解Java排序算法之歸并排序

    圖解Java排序算法之歸并排序

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 解決HashMap多線程操作導(dǎo)致死循環(huán)問題

    解決HashMap多線程操作導(dǎo)致死循環(huán)問題

    文章主要講述了在多線程環(huán)境下,HashMap的并發(fā)操作可能導(dǎo)致的死循環(huán)問題,包括鏈表/紅黑樹結(jié)構(gòu)破壞、擴(kuò)容過程中的混亂以及讀寫不一致等,為了解決這些問題,文章建議使用線程安全的ConcurrentHashMap替代HashMap,并介紹了其分段鎖機(jī)制和優(yōu)化方案
    2025-01-01
  • jmeter下載及安裝配置教程(win10平臺為例)

    jmeter下載及安裝配置教程(win10平臺為例)

    Apache?JMeter是Apache組織開發(fā)的基于Java的壓力測試工具,Apache?jmeter?可以用于對靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java?對象,數(shù)據(jù)庫和查詢,F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測試,本文給大家介紹jmeter下載及安裝配置過程,感興趣的朋友一起看看吧
    2021-12-12
  • SpringAOP+RabbitMQ+WebSocket實(shí)戰(zhàn)詳解

    SpringAOP+RabbitMQ+WebSocket實(shí)戰(zhàn)詳解

    這篇文章主要介紹了SpringAOP+RabbitMQ+WebSocket實(shí)戰(zhàn)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringBoot使用Sharding-JDBC實(shí)現(xiàn)數(shù)據(jù)分片和讀寫分離的方法

    SpringBoot使用Sharding-JDBC實(shí)現(xiàn)數(shù)據(jù)分片和讀寫分離的方法

    本文主要介紹了SpringBoot使用Sharding-JDBC實(shí)現(xiàn)數(shù)據(jù)分片和讀寫分離,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java實(shí)現(xiàn)簡單的socket通信教程

    Java實(shí)現(xiàn)簡單的socket通信教程

    這篇文章主要介紹了Java實(shí)現(xiàn)簡單的socket通信教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Spring?Data?Elasticsearch使用方式(Elasticsearch)

    Spring?Data?Elasticsearch使用方式(Elasticsearch)

    這篇文章主要介紹了Spring?Data?Elasticsearch使用方式(Elasticsearch),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評論

河池市| 苍溪县| 阳东县| 扶绥县| 富蕴县| 鄄城县| 绥宁县| 平江县| 姜堰市| 建德市| 古蔺县| 桐柏县| 木兰县| 合川市| 平湖市| 保靖县| 鲜城| 保山市| 酉阳| 会东县| 文化| 曲阜市| 上蔡县| 德格县| 中阳县| 哈巴河县| 安远县| 绿春县| 观塘区| 锦屏县| 伽师县| 库伦旗| 台江县| 汝南县| 汉寿县| 开阳县| 濮阳县| 景宁| 石泉县| 同心县| 商河县|