摘要:下面看看的構造函數是如何定義的。的每一個鍵值對都是通過內部的靜態(tài)類實例化的。如果你知道內部是如何工作的,就非常容易明白內部是如何工作的。
LinkedHashSet是HashSet的一個“擴展版本”,HashSet并不管什么順序,不同的是LinkedHashSet會維護“插入順序”。HashSet內部使用HashMap對象來存儲它的元素,而LinkedHashSet內部使用LinkedHashMap對象來存儲和處理它的元素。這篇文章,我們將會看到LinkedHashSet內部是如何運作的及如何維護插入順序的。
我們首先著眼LinkedHashSet的構造函數。在LinkedHashSet類中一共有4個構造函數。這些構造函數都只是簡單地調用父類構造函數(如HashSet類的構造函數)。
下面看看LinkedHashSet的構造函數是如何定義的。
//Constructor - 1 public LinkedHashSet(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor, true); //Calling super class constructor } //Constructor - 2 public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); //Calling super class constructor } //Constructor - 3 public LinkedHashSet() { super(16, .75f, true); //Calling super class constructor } //Constructor - 4 public LinkedHashSet(Collection extends E> c) { super(Math.max(2*c.size(), 11), .75f, true); //Calling super class constructor addAll(c); }
在上面的代碼片段中,你可能注意到4個構造函數調用的是同一個父類的構造函數。這個構造函數(父類的,譯者注)是一個包內私有構造函數(見下面的代碼,HashSet的構造函數沒有使用public公開,譯者注),它只能被LinkedHashSet使用。
這個構造函數需要初始容量,負載因子和一個boolean類型的啞值(沒有什么用處的參數,作為標記,譯者注)等參數。這個啞參數只是用來區(qū)別這個構造函數與HashSet的其他擁有初始容量和負載因子參數的構造函數,下面是這個構造函數的定義,
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); }
顯然,這個構造函數內部初始化了一個LinkedHashMap對象,這個對象恰好被LinkedHashSet用來存儲它的元素。
LinkedHashSet并沒有自己的方法,所有的方法都繼承自它的父類HashSet,因此,對LinkedHashSet的所有操作方式就好像對HashSet操作一樣。
唯一的不同是內部使用不同的對象去存儲元素。在HashSet中,插入的元素是被當做HashMap的鍵來保存的,而在LinkedHashSet中被看作是LinkedHashMap的鍵。
這些鍵對應的值都是常量PRESENT(PRESENT是HashSet的靜態(tài)成員變量,譯者注)。
可以參考How HashSet works internally in Java.
LinkedHashSet使用LinkedHashMap對象來存儲它的元素,插入到LinkedHashSet中的元素實際上是被當作LinkedHashMap的鍵保存起來的。
LinkedHashMap的每一個鍵值對都是通過內部的靜態(tài)類Entry
before和after來維護LinkedHasMap元素的插入順序。這兩個成員變量分別指向前一個和后一個元素,這讓LinkedHashMap也有類似雙向鏈表的表現。
private static class Entryextends HashMap.Entry { // These fields comprise the doubly linked list used for iteration. Entry before, after; Entry(int hash, K key, V value, HashMap.Entry next) { super(hash, key, value, next); } }
從上面代碼看到的LinkedHashMap內部類的前面兩個成員變量——before和after負責維護LinkedHashSet的插入順序。LinkedHashMap定義的成員變量header保存的是
這個雙向鏈表的頭節(jié)點。header的定義就像下面這樣,
private transient Entryheader; //Stores the head of the doubly linked list
In LinkedHashMap, the same set of Entry objects (rather references to Entry objects) are arranged in two different manner.
One is the HashMap and another one is Doubly linked list. The Entry objects just sit on heap memory,
unaware of that they are part of two different data structures.
接下來看一個例子就知道LinkedHashSet內部是如何工作的了。
public class LinkedHashSetExample { public static void main(String[] args) { //Creating LinkedHashSet LinkedHashSetset = new LinkedHashSet (); //Adding elements to LinkedHashSet set.add("BLUE"); set.add("RED"); set.add("GREEN"); set.add("BLACK"); } }
下面的圖片展示了這個程序是如何運行的。
如果你知道LinkedHashMap內部是如何工作的,就非常容易明白LinkedHashSet內部是如何工作的??匆槐?b>LinkedHashSet和LinkedHashMap的源碼,
你就能夠準確地理解在Java中LinkedHashSet內部是如何工作的。
原文鏈接:How LinkedHashSet Works Internally In Java
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/65565.html
摘要:并把最終的隨機數輸出到控制臺。方法,在集合中如何存儲元素取決于方法的返回值返回,集合中只有一個元素。創(chuàng)建集合對象,傳入比較器。 1_HashSet存儲字符串并遍歷 A:Set集合概述及特點 通過API查看即可 B:案例演示 HashSet存儲字符串并遍歷 import java.util.HashSet; public class Demo1_HashSet { p...
摘要:允許從任一方向來遍歷對象,并在遍歷迭代過程中進行修改該對象,還能獲得迭代器的當前位置。這個構造函數是將返回了一個對象給,這也是的存儲實現原理。 一、容器產生的原因 1.數組的缺點:大小一旦給定就無法更改,除非復制到一個新的數組中,開銷大;而容器類都可以自動地調整自己的尺寸?! ?.容器功能的多樣性:容器可以實現各種不同要求,如按不同依據將元素進行排序或者保證容器內無重復元素等等。關...
Set接口 Set是一個不能包含重復元素的Collection,它模擬了數學集抽象,Set接口僅包含從Collection繼承的方法,并添加禁止重復元素的限制,Set還為equals和hashCode操作的行為添加了一個更強的契約,允許Set實例有意義地進行比較,即使它們的實現類型不同,如果兩個Set實例包含相同的元素,則它們是相等的。 Java平臺包含三個通用的Set實現:HashSet、Tre...
摘要:當復制集合中的所有元素來創(chuàng)建新的集合時,要求集合中的所有元素必須是同一個枚舉類的枚舉值各實現類的性能分析的性能總比好,特別是最常用的添加查詢元素等操作。因為需要額外的紅黑樹算法來維護集合元素的次序。在創(chuàng)建時進行,以防對集合的意外非同步訪問 HashSet 大多時候使用Set集合時就是使用HashSet實現類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能 ...
摘要:就有這個功能,它是怎么實現有序的呢源碼分析繼承自,讓我們直接上源碼來看看它們有什么不同。是有序的,它是按照插入的順序排序的。所以,是不支持按訪問順序對元素排序的,只能按插入順序排序。 介紹 上一節(jié)我們說HashSet中的元素是無序的,那么有沒有什么辦法保證Set中的元素是有序的呢? 答案是當然可以。 LinkedHashSet就有這個功能,它是怎么實現有序的呢? 源碼分析 Linked...
閱讀 3210·2021-11-22 14:45
閱讀 3375·2019-08-29 13:11
閱讀 2376·2019-08-29 12:31
閱讀 978·2019-08-29 11:21
閱讀 3051·2019-08-29 11:09
閱讀 3677·2019-08-28 18:11
閱讀 1491·2019-08-26 13:58
閱讀 1350·2019-08-26 13:27