LinkedHashSetの詳しい説明

一緒に創造し、成長するために一緒に働きましょう!「ナゲッツデイリー新プラン・8月アップデートチャレンジ」参加30日目、イベント詳細はこちら

概要

日常業務で LInkedHashSet コンテナを多用しているかどうかはわかりませんが、とにかく基本的に使ったことがないので、この記事では主にその機能、使用シナリオ、および実装原理について説明します。いつもの仕事のお手伝い。

LinkedHashSet の紹介

LinkedHashSet は、LinkedHashMap に基づいて実装された重複排除セットの順序付きリストです。

  • LinkedHashSet の要素は複製されません
  • LinkedHashSet の要素は、追加の順序を維持して順序付けられます
  • LInkedHashSet は null 値を格納できます
  • LinkedHashSet はスレッドセーフでないコンテナです

上記は LinkedHashSet のクラス構造図です。

  • HashSetを継承しているため、HashSetに基づいて要素の順序を追加する機能を維持します

施工方法

  • LinkedHashSet()

説明: デフォルトの初期容量 16、負荷係数 0.75 で空のコンテナー リストを作成します。

  • LinkedHashSet(int initialCapacity, float loadFactor)

説明: 初期容量と負荷係数を指定してコンテナを作成します

キー方式

  • public boolean add(E e)

説明: コレクションに要素を追加します

  • public boolean remove(Object o)

説明: コレクションから要素を削除します

  • public void クリア()

説明: 空のコレクション要素

  • パブリック int サイズ()

説明: コレクション内の要素の数を返します

ユースケース

  1. LinkedHashSet の連続性を検証する
@Test
    public void test1() {
        Set<Integer> set = new LinkedHashSet<>();
        set.add(5);
        set.add(4);
        set.add(5);
        set.add(3);
        set.add(1);
        set.add(9);
        //正顺序遍历
        System.out.print("遍历:");
        set.forEach(item -> {
            System.out.print(item + "  ");
        });
    }
复制代码

操作結果:

  1. LinkedHashSet が null 値を格納することを確認する
 @Test
    public void test2() {
        Set<Integer> set = new LinkedHashSet<>();
        set.add(null);
        set.add(5);
        System.out.println(set);
    }
复制代码

操作結果:

コアメカニズム

基礎となる注文実現メカニズム

LinkedHashSet の最下層は LinkedHashMap であり、最下層は配列 + 双方向リンク リストを維持します。要素の hashCode 値に基づいて要素の格納場所を決定し、連結リストを使用して要素の順序を維持します。これにより、要素が挿入順に格納されているように見えます。

ソースコード分析

この記事では主に、LinkedhashSet が実際には LinkedHashMap に依存しているというソース コードの観点に注目しており、特定のロジックは引き続き LinkedHashMap の実装に注意を払う必要があります。

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

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

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


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

    
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}
复制代码
  • LinkedHashSet は HashSet を継承し、そのソース コードは非常に小さく、基本的に親クラスの HashSet のコンストラクターを呼び出すコンストラクターはわずかしかありません。
  • 親クラスのコンストラクターを見てください。これは、LinkedHashMap を作成する非パブリック コンストラクターであるため、LinkedHashMap の実装に依存します。

要約する

LinkedHashSet は、FIFO など、要素の順序を読み取る必要があるシナリオに主に適しています。

パフォーマンスに関しては、LinkedHashSet の挿入パフォーマンスは HashSet よりもわずかに低くなりますが、セット内のすべての要素に繰り返しアクセスする場合のパフォーマンスは良好です。

おすすめ

転載: juejin.im/post/7136555701563818021