1. ホーム
  2. java

[解決済み] HashSetとLinkedHashSetの比較

2022-04-24 22:52:16

質問

両者の違いは何ですか?知っているのは

LinkedHashSet は、HashSet の順序付きバージョンです。 は、すべての要素で二重にリンクされたリストを維持します。HashSet の代わりにこのクラスを使用します。 は、反復処理の順序を気にする場合です。HashSet を繰り返し処理するとき 一方、LinkedHashSet を使用することで、その要素を反復処理することができます。 を挿入された順に表示します。

しかし、LinkedHashSetのソースコードでは、HashSetのコンストラクタを呼び出しているだけです。では、2重リンクされたリストと挿入順序はどこにあるのでしょうか?

解決方法は?

その答えは どのコンストラクタ その LinkedHashSet は基底クラスを構築するために使用します。

public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);      // <-- boolean dummy argument
}

...

public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);            // <-- boolean dummy argument
}

...

public LinkedHashSet() {
    super(16, .75f, true);                         // <-- boolean dummy argument
}

...

public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);   // <-- boolean dummy argument
    addAll(c);
}

また、(一例ですが HashSet は、boolean引数をとるコンストラクタを記述しており、以下のようになります。

/**
 * Constructs a new, empty linked hash set.  (This package private
 * constructor is only used by LinkedHashSet.) The backing
 * HashMap instance is a LinkedHashMap with the specified initial
 * capacity and the specified load factor.
 *
 * @param      initialCapacity   the initial capacity of the hash map
 * @param      loadFactor        the load factor of the hash map
 * @param      dummy             ignored (distinguishes this
 *             constructor from other int, float constructor.)
 * @throws     IllegalArgumentException if the initial capacity is less
 *             than zero, or if the load factor is nonpositive
 */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}