一緒に創造し、成長するために一緒に働きましょう!「ナゲッツデイリー新プラン・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 サイズ()
説明: コレクション内の要素の数を返します
ユースケース
- 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 + " ");
});
}
复制代码
操作結果:
- 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 よりもわずかに低くなりますが、セット内のすべての要素に繰り返しアクセスする場合のパフォーマンスは良好です。