摘要:就有這個(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 LinkedHashSetextends 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 extends E> 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ò)來(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基本是一致,只是多了一些取最近的元素的方法。 // ...
摘要:下面總結(jié)一下集合常用的三個(gè)子類吧無(wú)序,允許為,底層是散列表紅黑樹(shù),非線程同步有序,不允許為,底層是紅黑樹(shù)非線程同步迭代有序,允許為,底層是雙向鏈表,非線程同步從結(jié)論而言我們就可以根據(jù)自己的實(shí)際情況來(lái)使用了。 前言 聲明,本文用的是jdk1.8 前面章節(jié)回顧: Collection總覽 List集合就這么簡(jiǎn)單【源碼剖析】 Map集合、散列表、紅黑樹(shù)介紹 HashMap就是這么簡(jiǎn)單【源碼...
摘要:設(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...
摘要:當(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ǔ)集合中的元素,因此具有很好的存取和查找性能 ...
閱讀 2704·2023-04-25 19:13
閱讀 4048·2021-09-22 15:34
閱讀 3062·2019-08-30 14:23
閱讀 1470·2019-08-29 17:17
閱讀 1616·2019-08-29 16:05
閱讀 1547·2019-08-29 13:26
閱讀 1224·2019-08-29 13:19
閱讀 563·2019-08-29 13:16