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

Java中的Set集合源碼詳細(xì)解讀

 更新時(shí)間:2023年11月15日 10:35:33   作者:緣之妙不可言  
這篇文章主要介紹了Java中的Set集合源碼詳細(xì)解讀,Set注重獨(dú)一無二的性質(zhì),該體系集合用于存儲(chǔ)無序(存入和取出的順序不一定相同)元素, 值不能重復(fù),需要的朋友可以參考下

Set集合

Set注重獨(dú)一無二的性質(zhì),該體系集合用于存儲(chǔ)無序(存入和取出的順序不一定相同)元素, 值不能重復(fù)。

對(duì)象的相等性本質(zhì)是對(duì)象hashCode值(java 是依據(jù)對(duì)象的內(nèi)存地址計(jì)算出的此序號(hào))判斷的(去重), 如果想要讓兩個(gè)不同的對(duì)象視為相等的,就必須覆蓋Object的hashCode方法和equals方法。

HashSet,(一張hash表)

哈希表邊存放的是哈希值。HashSet 存儲(chǔ)元素的順序并不是按照存入時(shí)的順序(和List顯然不同)而是按照哈希值來存的所以取數(shù)據(jù)也是按照哈希值取得。 元素的哈希值是通過元素的hashCode方法來獲取的, **HashSet首先判斷兩個(gè)元素的哈希值,如果哈希值一樣,接著會(huì)比較equals方法如果equals結(jié)果為true,HashSet 就視為同一個(gè)元素。**如果equals為false就不是同一個(gè)元素。 哈希值相同equals為false的元素存儲(chǔ): 在同樣的哈希值下順延(可以認(rèn)為哈希值相同的元素放在一個(gè)哈希桶中)。也就是哈希一樣的存一列

TreeSet(二叉樹)

  1. TreeSet()是使用二 叉樹的原理對(duì)新add)的對(duì)象按照指定的順序排序(升序、降序),每增加一個(gè)對(duì)象都會(huì)進(jìn)行排序,將對(duì)象插入的二叉樹指定的位置。
  2. Integer 和String對(duì)象都可以進(jìn)行默認(rèn)的TreeSet排序,而自定義類的對(duì)象是不可以的,自己定義的類必須實(shí)現(xiàn)Comparable接口,并且覆寫相應(yīng)的compareTo)函數(shù),才可以正常使用
  3. 在覆寫 compare()函數(shù)時(shí),要返回相應(yīng)的值才能使TreeSet按照一定的規(guī)則來排序。
  4. 比較此對(duì)象與指定對(duì)象的順序。如果該對(duì)象小于、等于或大于指定對(duì)象,則分別返回負(fù)整 數(shù)、零或正整數(shù)。

LinkHashSet (HashSet+ LinkedHashMap)

對(duì)于LinkedHashSet 而言,它繼承與HashSet、 又基于LinkedHashMap 來實(shí)現(xiàn)的。

LinkedHashSet底層使用LinkedHashMap來保存所有元素,它繼承與HashSet,其所有的方法操作_上又與HashSet相同,因此LinkedHashSet的實(shí)現(xiàn)上非常簡(jiǎn)單,只提供了四個(gè)構(gòu)造方法,并通過傳遞-一個(gè)標(biāo)識(shí)參數(shù),調(diào)用父類的構(gòu)造器,底層構(gòu)造-個(gè)LinkedHashMap 來實(shí)現(xiàn),在相關(guān)操作.上與父類HashSet的操作相同,直接調(diào)用父類HashSet的方法即可。

HashSet源碼

Set是基于HashMap實(shí)現(xiàn)的,源碼主要體現(xiàn)的是它的獨(dú)一無二,不可重復(fù)性

HashSet構(gòu)造方法(4個(gè))就是新建一個(gè)HashMap(參考HashMap的構(gòu)造,共四個(gè))

 public HashSet() {
        map = new HashMap<>();
    }

我們?cè)倏匆幌鹿俜筋愖⑨專?/p>

此類實(shí)現(xiàn)Set接口,支持由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)。 它不保證為向集合的迭代順序; 特別是,它不保證該順序恒久不變。 此類允許null元素。
這個(gè)類提供了基本操作( 添加 , 刪除 , 包含和大小 ),假定哈希函數(shù)將恒定的時(shí)間性能分散的元素正確的桶中。 遍歷該集合需要時(shí)間正比于HashSet實(shí)例的大?。ㄔ氐臄?shù)量)加上其底層HashMap實(shí)例的“容量”(桶的數(shù)量)的總和。 因此,不要將初始容量設(shè)置得太高(或負(fù)載因數(shù)過低),如果迭代性能很重要,非常重要。
注意,此實(shí)現(xiàn)不是同步的。 如果多個(gè)線程同時(shí)訪問一個(gè)散列集,螺紋修改的和至少一個(gè)設(shè)定的,它必須被外部同步。 這通常是通過一些對(duì)象自然封裝該組同步操作來完成。 如果該對(duì)象不存在,該組應(yīng)該被“包裝”使用Collections.synchronizedSet方法。 這最好在創(chuàng)建時(shí)完成,以防止對(duì)set的意外非同步訪問:
     Set s = Collections.synchronizedSet(new HashSet(...));
此類的iterator方法返回的迭代器是快速失敗的 :如果集合隨時(shí)修改創(chuàng)建迭代器之后,以任何方式除非通過迭代器自身的remove方法,迭代器將拋出ConcurrentModificationException 。 因此,在并發(fā)的修改,迭代器很快就會(huì)完全失敗,而不是在將來不確定的時(shí)間任意冒險(xiǎn),不確定性的行為。
注意的迭代器無法保證,因?yàn)?,一般來說快速失敗行為,不可能作出任何硬性保證不同步并發(fā)修改的存在。 快速失敗的迭代器拋出ConcurrentModificationException盡最大努力的基礎(chǔ)上。 因此,這將是錯(cuò)誤的,寫一個(gè)程序,依賴于此異常的它的正確性: 迭代器的快速失敗行為應(yīng)該僅用于檢測(cè)bug。
這個(gè)類是成員的Java集合框架 

闡述關(guān)鍵:

  • 元素?zé)o序
  • 允許null元素
  • 迭代時(shí)允許快速失敗,既是線程不安全的(繼承的HashMap的內(nèi)容),就是不能在迭代時(shí)被其它線程以任何形式修改結(jié)構(gòu),這幾乎是所有集合的保護(hù)機(jī)制(Vector除外)(不懂可自行百度)

HashSet集合不少源碼都得在HashMap中才看得到, 源碼中還有一些多的功能: 例如序列化與反序列化:

	//序列化
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
        // Write out any hidden serialization magic
        s.defaultWriteObject();

        // Write out HashMap capacity and load factor
        s.writeInt(map.capacity());
        s.writeFloat(map.loadFactor());

        // Write out size
        s.writeInt(map.size());

        // Write out all elements in the proper order.
        for (E e : map.keySet())
            s.writeObject(e);
    }

    /**
    反序列化
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
        // Read in any hidden serialization magic
        s.defaultReadObject();

        // Read capacity and verify non-negative.
        int capacity = s.readInt();
        if (capacity < 0) {
            throw new InvalidObjectException("Illegal capacity: " +
                                             capacity);
        }

        // Read load factor and verify positive and non NaN.
        float loadFactor = s.readFloat();
        if (loadFactor <= 0 || Float.isNaN(loadFactor)) {
            throw new InvalidObjectException("Illegal load factor: " +
                                             loadFactor);
        }

        // Read size and verify non-negative.
        int size = s.readInt();
        if (size < 0) {
            throw new InvalidObjectException("Illegal size: " +
                                             size);
        }

   
        capacity = (int) Math.min(size * Math.min(1 / loadFactor, 4.0f),
                HashMap.MAXIMUM_CAPACITY);

        // Create backing HashMap
        map = (((HashSet<?>)this) instanceof LinkedHashSet ?
               new LinkedHashMap<E,Object>(capacity, loadFactor) :
               new HashMap<E,Object>(capacity, loadFactor));

        // Read in all elements in the proper order.
        for (int i=0; i<size; i++) {
            @SuppressWarnings("unchecked")
                E e = (E) s.readObject();
            map.put(e, PRESENT);
        }
    }

TreeSet源碼

沒什么太多說的,還是以TreeMap集合為基礎(chǔ),添加Set的特點(diǎn),與HashSet&HashMap差不多

HashSet去重

hashSet元素獨(dú)一無二

去重判斷有兩個(gè)條件因子(Object的方法):

1.hashCode() 【java根據(jù)對(duì)象的內(nèi)存地址計(jì)算的Hash值】

2.equals() 【在條件一返回hash值相同時(shí),會(huì)使用此方法進(jìn)行判斷,如果返回true,則表明是同一元素,一般是一個(gè)多屬性對(duì)象的自定義相對(duì)方式(重寫對(duì)象的equals())】

到此這篇關(guān)于Java中的Set集合源碼詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Set集合源碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用RabbitMQ實(shí)現(xiàn)異步秒殺

    如何使用RabbitMQ實(shí)現(xiàn)異步秒殺

    這篇文章主要介紹了如何使用RabbitMQ實(shí)現(xiàn)異步秒殺,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • Java面試必考之如何在項(xiàng)目中優(yōu)雅的拋出異常

    Java面試必考之如何在項(xiàng)目中優(yōu)雅的拋出異常

    這篇文章主要為大家詳細(xì)介紹了Java中的幾種異常關(guān)鍵字和異常類相關(guān)知識(shí),本文比較適合剛?cè)肟覬ava的小白以及準(zhǔn)備秋招的大佬閱讀,需要的可以收藏一下
    2023-06-06
  • Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析

    Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析

    UDP實(shí)現(xiàn)通信非常簡(jiǎn)單,沒有服務(wù)器,每個(gè)都是客戶端,每個(gè)客戶端都需要一個(gè)發(fā)送端口和一個(gè)接收端口,本文給大家介紹Java網(wǎng)絡(luò)編程之UDP實(shí)現(xiàn)原理解析,感興趣的朋友一起看看吧
    2021-09-09
  • 解讀controller層,service層,mapper層,entity層的作用與聯(lián)系

    解讀controller層,service層,mapper層,entity層的作用與聯(lián)系

    這篇文章主要介紹了關(guān)于controller層,service層,mapper層,entity層的作用與聯(lián)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java實(shí)現(xiàn)n位數(shù)字的全排列

    Java實(shí)現(xiàn)n位數(shù)字的全排列

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)n位數(shù)字的全排列,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 關(guān)于Java的Condition接口最佳理解方式

    關(guān)于Java的Condition接口最佳理解方式

    這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語言內(nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下
    2023-05-05
  • Java如何利用遞歸計(jì)算出階乘

    Java如何利用遞歸計(jì)算出階乘

    這篇文章主要介紹了Java如何通過遞歸計(jì)算出階乘,文中介紹了遞歸的使用方法和基本特點(diǎn),以及相關(guān)示例代碼,對(duì)大家的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • 詳解 Hive UDF 開發(fā)之Java 實(shí)現(xiàn)步驟與代碼調(diào)試技巧

    詳解 Hive UDF 開發(fā)之Java 實(shí)現(xiàn)步驟與代碼調(diào)試技巧

    這篇文章主要介紹了詳解 Hive UDF 開發(fā)之Java實(shí)現(xiàn)步驟與代碼調(diào)試技巧,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • 如何避免在Java?中使用雙括號(hào)初始化

    如何避免在Java?中使用雙括號(hào)初始化

    這篇文章主要介紹了如何避免在Java中使用雙括號(hào)初始化,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    jsoup是一個(gè)非常好的解析網(wǎng)頁的包,用java開發(fā)的,提供了類似DOM,CSS選擇器的方式來查找和提取文檔中的內(nèi)容,提取文檔內(nèi)容時(shí)會(huì)出現(xiàn)超時(shí)的情況,解決方法可看下文
    2013-11-11

最新評(píng)論

察隅县| 土默特左旗| 剑川县| 田林县| 砚山县| 宜阳县| 喀喇沁旗| 平潭县| 武乡县| 临西县| 策勒县| 宁陵县| 延吉市| 青州市| 句容市| 彰化市| 三江| 高安市| 岐山县| 旬阳县| 花垣县| 神木县| 定兴县| 沐川县| 临沧市| 多伦县| 和硕县| 错那县| 民丰县| 都江堰市| 上犹县| 太康县| 阳谷县| 诸城市| 绥棱县| 靖远县| 中宁县| 平昌县| 舒城县| 泊头市| 新竹县|