Java集合学習シリーズに深く入り込む:LinkedHashSetの実現原理


1.    LinkedHashSetの概要:
   LinkedHashSetは、反復順序が予知可能なSetインタフェースを有するハッシュテーブルおよびリンクリスト実装である.この実装は、HashSetとは異なり、後者はすべてのエントリで実行される二重リンクリストを維持している.このリンク・リストは、挿入順序またはアクセス順序の反復順序を定義します.
   このインプリメンテーションは同期されていないことに注意してください.複数のスレッドがリンクされたハッシュSetに同時にアクセスし、少なくとも1つのスレッドがSetを変更した場合、外部同期を維持する必要があります.
 
2.    LinkedHashSetの実装:
   LinkedHashSetの場合、それはHashSetと継承され、LinkedHashMapに基づいて実現される.
   LinkedHashSetの下位層はLinkedHashMapを使用してすべての要素を保存し、HashSetと継承し、そのすべての方法の操作はHashSetと同じであるため、LinkedHashSetの実装は非常に簡単で、4つの構造方法しか提供されず、1つの識別パラメータを渡すことによって親クラスのコンストラクタを呼び出し、下位層はLinkedHashMapを構築することによって実現される.関連する操作では親HashSetの操作と同様に親HashSetのメソッドを直接呼び出せばよい.LinkedHashSetのソースコードは次のとおりです.
public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = -2851667679971038690L;

    /**
     *                         set。
     *
     *             ,                 LinkedHashMap  。
     * @param initialCapacity     。
     * @param loadFactor     。
     */
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    /**
     *                   0.75       set。
     *
     *             ,                  0.75 LinkedHashMap  。
     * @param initialCapacity     。
     */
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }

    /**
     *            16     0.75       set。
     *
     *             ,           16     0.75 LinkedHashMap  。
     */
    public LinkedHashSet() {
        super(16, .75f, true);
    }

    /**
     *        collection            set。
     * 
     *             ,          collection
     *                 0.75 LinkedHashMap  。
     * @param c           set  collection。
     */
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}

   親HashSetでLinkedHashSetに特化した構造方法は、パッケージアクセス権であり、公開されていない.
/**
     *     initialCapacity loadFactor             。
     *            ,     ,      LinkedHashSet   。
     *
     *                 LinkedHashMap     。
     * @param initialCapacity     。
     * @param loadFactor     。
     * @param dummy   。
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
	map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
    }

    上記のソースコードから分かるように,LinkedHashSetはHashSetを継承し,下位層はLinkedHashMapを用いることで,それ自体のすべての機能を簡単明瞭に実現した.
 
3.  関連説明:
   1)HashSetの実現原理については、前回のまとめ:Java集合学習シリーズに深く入り込む:HashSetの実現原理を参照してください.
   2)HashMapの実現原理については、前回のまとめ:Java集合学習シリーズに深く入り込む:HashMapの実現原理を参照してください.