166

それらの違いは何ですか?そんなこと知ってる

LinkedHashSet は、すべての要素にわたって二重にリンクされた List を維持する HashSet の順序付きバージョンです。反復順序が重要な場合は、HashSet の代わりにこのクラスを使用してください。HashSet を反復処理する場合、順序は予測できませんが、LinkedHashSet を使用すると、挿入された順序で要素を反復処理できます。

しかし、LinkedHashSet のソースコードには、HashSet の呼び出しコンストラクタしかありません。では、二重リンクされたリストと広告掲載順はどこにあるのでしょうか?

4

10 に答える 10

68

答えは、基本クラスを構築するために使用するコンストラクターにあります。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ブール引数を取るコンストラクタが記述されており、次のようになります。

/**
 * 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);
}
于 2011-02-22T16:10:46.820 に答える
33

HashSet順序付けソートもされていないSet です。
LinkedHashSetはHashSet の順序付きバージョンです。

HashSetLinkedHashSetの唯一の違いは次のとおりです。
LinkedHashSetは挿入順序を維持します。

HashSetを反復処理する場合、順序は予測できませんが、 LinkedHashSetの場合は予測可能です。

LinkedHashSetが挿入順序を維持する方法の理由は次
のとおりです: 基になる使用されるデータ構造はDoubly-Linked-Listです。

于 2016-07-01T09:33:23.493 に答える
25

LinkedHashSetのコンストラクターは、次の基本クラスのコンストラクターを呼び出します。

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
}

ご覧のとおり、内部マップはLinkedHashMap. の内部を見るとLinkedHashMap、次のフィールドが見つかります。

private transient Entry<K, V> header;

これが問題のリンク リストです。

于 2011-02-22T16:11:48.760 に答える
9

HashSetそれが呼び出すコンストラクターのソースを確認する必要があります...これは、バッキングをMap単なるLinkedHashMapではなく にする特別なコンストラクターですHashMap

于 2011-02-22T16:09:11.890 に答える
1

クラスから呼び出されたコンストラクターLinkedHashSetを見ると、内部的にLinkedHashMapバッキングの目的で使用されていることがわかります。

于 2011-02-22T16:12:12.947 に答える
0

すべてのメソッドとコンストラクターは同じですが、LinkedHashset は挿入順序を維持しますが、重複を許可しないという違いが 1 つだけあります。

ハッシュセットは挿入順序を維持しません。List と Set のシンプルな組み合わせです:)

于 2016-08-21T12:24:20.523 に答える