成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[學(xué)習(xí)筆記-Java集合-10] Set - LinkedHashSet源碼分析

ThreeWords / 2758人閱讀

摘要:就有這個(gè)功能,它是怎么實(shí)現(xiàn)有序的呢源碼分析繼承自,讓我們直接上源碼來(lái)看看它們有什么不同。是有序的,它是按照插入的順序排序的。所以,是不支持按訪問(wèn)順序?qū)υ嘏判虻模荒馨床迦腠樞蚺判颉?/p>

介紹

上一節(jié)我們說(shuō)HashSet中的元素是無(wú)序的,那么有沒(méi)有什么辦法保證Set中的元素是有序的呢?

答案是當(dāng)然可以。 LinkedHashSet就有這個(gè)功能,它是怎么實(shí)現(xiàn)有序的呢?

源碼分析

LinkedHashSet繼承自HashSet,讓我們直接上源碼來(lái)看看它們有什么不同。

package java.util;

// LinkedHashSet繼承自HashSet
public class LinkedHashSet
    extends HashSet
    implements Set, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = -2851667679971038690L;

    // 傳入容量和裝載因子
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    // 只傳入容量, 裝載因子默認(rèn)為0.75
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    // 使用默認(rèn)容量16, 默認(rèn)裝載因子0.75
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    // 將集合c中的所有元素添加到LinkedHashSet中
    // 好奇怪, 這里計(jì)算容量的方式又變了
    // HashSet中使用的是Math.max((int) (c.size()/.75f) + 1, 16)
    // 這一點(diǎn)有點(diǎn)不得其解, 是作者偷懶?
    public LinkedHashSet(Collection c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }

    // 可分割的迭代器, 主要用于多線程并行迭代處理時(shí)使用
    @Override
    public Spliterator spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT | Spliterator.ORDERED);
    }
}

完了,這是全部源碼了。

可以看到,LinkedHashSet中一共提供了5個(gè)方法,其中4個(gè)是構(gòu)造方法,還有一個(gè)是迭代器。

4個(gè)構(gòu)造方法都是調(diào)用父類的super(initialCapacity, loadFactor, true);這個(gè)方法。

這個(gè)方法就是我們上一節(jié)說(shuō)過(guò),HashSet的一個(gè)不是public的構(gòu)造方法。

   // HashSet的構(gòu)造方法
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

如上所示,這個(gè)構(gòu)造方法里面使用了LinkedHashMap來(lái)初始化HashSet中的map。

現(xiàn)在這個(gè)邏輯應(yīng)該很清晰了,LinkedHashSet繼承自HashSet,它的添加、刪除、查詢等方法都是直接用的HashSet的,唯一的不同就是它使用LinkedHashMap存儲(chǔ)元素。

總結(jié)

(1)LinkedHashSet的底層使用LinkedHashMap存儲(chǔ)元素。

(2)LinkedHashSet是有序的,它是按照插入的順序排序的。

思考

通過(guò)上面的學(xué)習(xí),我們知道LinkedHashSet底層使用LinkedHashMap存儲(chǔ)元素,而LinkedHashMap是支持按元素訪問(wèn)順序遍歷元素的,也就是可以用來(lái)實(shí)現(xiàn)LRU的。

那么,LinkedHashSet支持按元素訪問(wèn)順序排序嗎?

讓我們一起來(lái)分析下。

首先,LinkedHashSet所有的構(gòu)造方法都是調(diào)用HashSet的同一個(gè)構(gòu)造方法,如下:

  // HashSet的構(gòu)造方法
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }
    
## 然后,通過(guò)調(diào)用LinkedHashMap的構(gòu)造方法初始化map,如下所示: 

    public LinkedHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        accessOrder = false;
    }

可以看到,這里把a(bǔ)ccessOrder寫(xiě)死為false了。

所以,LinkedHashSet是不支持按訪問(wèn)順序?qū)υ嘏判虻?/b>,只能按插入順序排序。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76233.html

相關(guān)文章

  • [學(xué)習(xí)筆記-Java集合-13] Set - ConcurrentSkipListSet源碼分析

    摘要:介紹底層是通過(guò)來(lái)實(shí)現(xiàn)的,它是一個(gè)有序的線程安全的集合。源碼分析它的源碼比較簡(jiǎn)單,跟通過(guò)實(shí)現(xiàn)的基本是一致,只是多了一些取最近的元素的方法。 介紹 ConcurrentSkipListSet底層是通過(guò)ConcurrentNavigableMap來(lái)實(shí)現(xiàn)的,它是一個(gè)有序的線程安全的集合。 源碼分析 它的源碼比較簡(jiǎn)單,跟通過(guò)Map實(shí)現(xiàn)的Set基本是一致,只是多了一些取最近的元素的方法。 // ...

    yunhao 評(píng)論0 收藏0
  • 3分鐘搞掂Set集合

    摘要:下面總結(jié)一下集合常用的三個(gè)子類吧無(wú)序,允許為,底層是散列表紅黑樹(shù),非線程同步有序,不允許為,底層是紅黑樹(shù)非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結(jié)論而言我們就可以根據(jù)自己的實(shí)際情況來(lái)使用了。 前言 聲明,本文用的是jdk1.8 前面章節(jié)回顧: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Map集合、散列表、紅黑樹(shù)介紹 HashMap就是這么簡(jiǎn)單【源碼...

    widuu 評(píng)論0 收藏0
  • java集合

    摘要:集合類簡(jiǎn)介集合類包含在包下集合類存放的是對(duì)象的引用,而非對(duì)象本身。集合類型主要分為集,列表,映射。返回此有序集合中當(dāng)前第一個(gè)最小的元素。集合中元素被訪問(wèn)的順序取決于集合的類型。 Java集合類 1.簡(jiǎn)介: java集合類包含在java.util包下集合類存放的是對(duì)象的引用,而非對(duì)象本身。集合類型主要分為Set(集),List(列表),Map(映射)。 1.1 java集合類圖 sho...

    Pluser 評(píng)論0 收藏0
  • Spring Boot 2.x 啟動(dòng)全過(guò)程源碼分析(上)入口類剖析

    摘要:設(shè)置應(yīng)用上線文初始化器的作用是什么源碼如下。來(lái)看下方法源碼,其實(shí)就是初始化一個(gè)應(yīng)用上下文初始化器實(shí)例的集合。設(shè)置監(jiān)聽(tīng)器和設(shè)置初始化器調(diào)用的方法是一樣的,只是傳入的類型不一樣,設(shè)置監(jiān)聽(tīng)器的接口類型為,對(duì)應(yīng)的文件配置內(nèi)容請(qǐng)見(jiàn)下方。 Spring Boot 的應(yīng)用教程我們已經(jīng)分享過(guò)很多了,今天來(lái)通過(guò)源碼來(lái)分析下它的啟動(dòng)過(guò)程,探究下 Spring Boot 為什么這么簡(jiǎn)便的奧秘。 本篇基于 S...

    MobService 評(píng)論0 收藏0
  • Java 集合 Set

    摘要:當(dāng)復(fù)制集合中的所有元素來(lái)創(chuàng)建新的集合時(shí),要求集合中的所有元素必須是同一個(gè)枚舉類的枚舉值各實(shí)現(xiàn)類的性能分析的性能總比好,特別是最常用的添加查詢?cè)氐炔僮?。因?yàn)樾枰~外的紅黑樹(shù)算法來(lái)維護(hù)集合元素的次序。在創(chuàng)建時(shí)進(jìn)行,以防對(duì)集合的意外非同步訪問(wèn) HashSet 大多時(shí)候使用Set集合時(shí)就是使用HashSet實(shí)現(xiàn)類。HashSet按Hash算法來(lái)存儲(chǔ)集合中的元素,因此具有很好的存取和查找性能 ...

    verano 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<