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

Java集合中的LinkedHashSet源碼解讀

 更新時(shí)間:2023年12月29日 10:32:51   作者:理想萬歲萬萬歲  
這篇文章主要介紹了Java集合中的LinkedHashSet源碼解讀,在LinkedHashMap中,雙向鏈表的遍歷順序通過構(gòu)造方法指定,如果沒有指定,則使用默認(rèn)順序?yàn)椴迦腠樞?即accessOrder=false,需要的朋友可以參考下

一、介紹

前面文章中我們從源碼詳細(xì)介紹了繼承于HashMap的LinkedHashMap,并通過圖片示例講解了LinkedHashMap是如何在HashMap的哈希表上將各個(gè)節(jié)點(diǎn)通過雙向鏈表串起來的。

也講解了基于HashMap實(shí)現(xiàn)的HashSet,那么是否存在類似于LinkedHashMap原理的一種Set集合?答案是肯定的,而且是我們本篇文章要講的LinkedHashSet

顧名思義,LinkedHashSet是基于LinkedHashMap實(shí)現(xiàn)的一個(gè)Set集合。

另外,本片文章雖然不長(zhǎng),但是對(duì)前置知識(shí)點(diǎn)有著很強(qiáng)的依賴,需要掌握的前置知識(shí)有:HashMap(必選)、紅黑樹(可選)、LinkedHashMap(必選)、HashSet(必選)

二、類的聲明

public class LinkedHashSet<E> extends HashSet<E>
							    implements Set<E>, Cloneable, java.io.Serializable

從類的聲明中可以看到

  • 繼承HashSet,表示LinkedHashSet是對(duì)HashSet的擴(kuò)展。
  • 實(shí)現(xiàn)set接口,滿足Set集合的定義
  • 實(shí)現(xiàn)了Cloneable接口,提供了對(duì)象克隆方法,但請(qǐng)注意,是淺克隆。
  • 實(shí)現(xiàn)了Serializable接口,支持序列化。

三、構(gòu)造方法

前面我們?cè)谥vHashSet的構(gòu)造方法時(shí),其中有一個(gè)構(gòu)造方法我們做了特殊對(duì)待,如下所示

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

該構(gòu)造方法創(chuàng)建的map對(duì)象的類型是LinkedHashMap,不同于其他構(gòu)造方法創(chuàng)建的HashMap對(duì)象。

而且我們有個(gè)關(guān)鍵點(diǎn)不要忽略,在LinkedHashMap中,雙向鏈表的遍歷順序通過構(gòu)造方法指定,如果沒有指定,則使用默認(rèn)順序?yàn)椴迦腠樞?,即accessOrder=false。因此,上面的構(gòu)造方法所創(chuàng)建的LinkedHashMap對(duì)象的雙向鏈表遍歷順序?yàn)椴迦腠樞颉?/p>

且該構(gòu)造方法就是為了給其子類LinkedHashSet使用的。我們往下看

無參構(gòu)造

創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為16,加載因子為0.75

public LinkedHashSet() {
    super(16, .75f, true);
}

指定初始容量

創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為initialCapacity,加載因子為0.75

public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);
}

指定初始容量和加載因子

創(chuàng)建LinkedHashMap實(shí)例為內(nèi)部屬性,并指定底層哈希表的初始容量為initialCapacity,加載因子為loadFactor

public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);
}

通過集合構(gòu)造

雖然說LinkedHashSet的底層是LinkedHashMap,但終究還是哈希表+雙向鏈表,需要對(duì)哈希表的容量進(jìn)行計(jì)算以避免頻繁的擴(kuò)容。

創(chuàng)建LinkedHashMap實(shí)例作為內(nèi)部對(duì)象后,通過addAll()方法將集合中的元素逐一保存,addAll()方法作為一個(gè)批量保存模版由其父類AbstractCollection提供,其中的add()方法由父類HashSet實(shí)現(xiàn),這是設(shè)計(jì)模式—模版方法的體現(xiàn)。

public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);
    addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

四、最后

看了LinkedHashSet的源碼后,發(fā)現(xiàn)它只提供了以上幾個(gè)構(gòu)造函數(shù),卻沒有提供各個(gè)方法。

這是因?yàn)樗^承于HashSet,因此HashSet中提供的方法都是可以被LinkedHashSet對(duì)象調(diào)用的,如add()、remove()、contains()等方法。所以不再過多介紹,

五、結(jié)論

  • LinkedHashSet內(nèi)部維護(hù)一個(gè)LinkedHashMap對(duì)象,其底層數(shù)據(jù)結(jié)構(gòu)為哈希表+鏈表+紅黑樹+雙向鏈表
  • LinkedHashSet對(duì)內(nèi)部雙向鏈表的遍歷順序?yàn)椴迦腠樞?/li>

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

相關(guān)文章

  • Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了面向切面編程(AOP)的概念、快速入門、核心概念、切點(diǎn)確定、通知分類、獲取被增強(qiáng)方法相關(guān)信息、應(yīng)用案例、XML配置、多切面順序問題以及AOP原理中的動(dòng)態(tài)代理,通過實(shí)例展示了如何在Spring框架中使用AOP進(jìn)行方法增強(qiáng),感興趣的朋跟隨小編一起看看吧
    2025-11-11
  • 使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    這篇文章主要介紹了使用java代碼獲取新浪微博應(yīng)用的access token實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Java利用廣度優(yōu)先搜索實(shí)現(xiàn)抓牛問題

    Java利用廣度優(yōu)先搜索實(shí)現(xiàn)抓牛問題

    廣度優(yōu)先搜索是最簡(jiǎn)便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。本文將利用廣度優(yōu)先搜索實(shí)現(xiàn)抓牛問題,感興趣的可以了解下
    2022-06-06
  • 淺聊一下Java中的鎖機(jī)制

    淺聊一下Java中的鎖機(jī)制

    Java中的鎖機(jī)制是保證多線程并發(fā)訪問共享資源安全性的重要手段之一。Java提供了兩種類型的鎖機(jī)制:synchronized關(guān)鍵字和Lock接口。本文將介紹這兩種鎖機(jī)制的原理及使用方法,并通過代碼示例講解它們的使用
    2023-03-03
  • 詳解IDEA 啟動(dòng)tomcat 端口占用原因以及解決方法( 使用debug模式)

    詳解IDEA 啟動(dòng)tomcat 端口占用原因以及解決方法( 使用debug模式)

    這篇文章主要介紹了詳解IDEA 啟動(dòng)tomcat 端口占用原因以及解決方法( 使用debug模式) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析

    Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析

    這篇文章主要介紹了Struts2實(shí)現(xiàn)文件上傳功能實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • 詳解Spring 中如何控制2個(gè)bean中的初始化順序

    詳解Spring 中如何控制2個(gè)bean中的初始化順序

    本篇文章主要介紹了Spring 中如何控制2個(gè)bean中的初始化順序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • springboot(thymeleaf)中th:field和th:value的區(qū)別及說明

    springboot(thymeleaf)中th:field和th:value的區(qū)別及說明

    這篇文章主要介紹了springboot(thymeleaf)中th:field和th:value的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java內(nèi)存釋放實(shí)現(xiàn)代碼案例

    Java內(nèi)存釋放實(shí)現(xiàn)代碼案例

    這篇文章主要介紹了Java內(nèi)存釋放實(shí)現(xiàn)代碼案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Jpa中Specification的求和sum不生效原理分析

    Jpa中Specification的求和sum不生效原理分析

    這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

宁河县| 延安市| 射洪县| 宝鸡市| 涟水县| 桦南县| 卓资县| 隆化县| 阿合奇县| 赣州市| 南京市| 辽宁省| 杭州市| 吴桥县| 通渭县| 苍南县| 洛南县| 育儿| 大方县| 济南市| 报价| 舞钢市| 修水县| 富川| 探索| 荥阳市| 乌兰察布市| 左云县| 普宁市| 成武县| 宽城| 呈贡县| 瓦房店市| 旺苍县| 沿河| 张家港市| 汶川县| 永靖县| 耿马| 额尔古纳市| 藁城市|