Java容器類框架分析(6)LinkedHashSet源碼分析

在分析LinkedHashSet的時候,先看一下它的繼承關係安全

LinkedHashSet的繼承關係
LinkedHashSet的繼承關係

能夠看到LinkedHash繼承自HashSet,即擁有HashSet的所有屬性,接着來看一下源碼中的註釋bash

  • Hash table and linked list implementation of the Set interface,
    with predictable iteration order. This implementation differs from
    HashSet in that it maintains a doubly-linked list running through
    all of its entries. This linked list defines the iteration ordering,
    which is the order in which elements were inserted into the set
    (insertion-order). Note that insertion order is not affected
    if an element is re-inserted into the set.
  • 這個類是實現了Set接口的哈希表跟鏈表。此實現類跟HashSet的區別在於它內部持有一個雙鏈表而且存儲了全部的entry。這個鏈表定義了迭代的順序,該順序就是元素被插入Set的順序。注意若是一個元素被重複插入,迭代順序是不會被影響的。

看到這裏,感受其實跟HashSet一個套路,底層都不是本身實現的,而是經過內部實現的一個LinkedHashMap來維護的,所謂HashSet取地是HashMap的key,HashSet取地是LinkedHashMap的Key,下面從源碼的角度來驗證一下。ui

正文

成員變量

就一個序列化Id,其他的所有繼承自HashSetspa

private static final long serialVersionUID = -2851667679971038690L;複製代碼

構造方法

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

    public LinkedHashSet() {
        super(16, .75f, true);
    }複製代碼

能夠發現,無論是調用哪個構造方法,最後調用的都是調用的同一個父類方法,也就是上一篇HashSet中的一個LinkedHashMap的初始化方法,最終仍是初始化了一個LinkedHashMap線程

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

Over

當我還想繼續查看的時候,發現其實已經沒有能夠分析的了,沒有複寫HashSet的其它方法,因此,LinkedHashSet內部沒有作過不少的實現,只是調用了HashSet的初始化LinkedHashMap的構造方法,剩餘的操做跟HashSet其實是同樣的,沒有什麼區別。code

總結

  1. LinkedHashSet中的LinkedHash跟LinkedHashMap中的LinkedHash其實是同樣的,哈希表跟鏈表
  2. LinkedHashSet跟HashSet都是非線程安全的,不容許重複元素
  3. LinkedHashSet都容許插入null,插入的元素須要複寫hashcode跟equals方法
相關文章
相關標籤/搜索