コレクションファミリーセット(6):HashSetの

HashSetのは、セットAbstractSet抽象クラスを継承し、Setインタフェースを実装しているハッシュの集まりであり、実装しています。

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

原則

HashSetの原理を理解するために、我々は、コンストラクタは、2つのコアの方法は、1つずつ、クラスのメンバ変数を導入します。

クラスメンバ変数

// HashSet内部使用HashMap存储
private transient HashMap<E,Object> map;
// 存储在value上的值
private static final Object PRESENT = new Object();

PRESENT値は、すべてのキーに格納されている間、クラスのメンバ変数から、我々は、HashSetのHashMapの内部ストレージを使用し、知ることができます。だから、HashSetのために、そのキー値のすべてが同じです。

コンストラクタ

5つのHashSetのコンストラクタの合計。

public HashSet() {
    map = new HashMap<>();
}

public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

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

私たちは、主に、渡されたコンストラクタの引数は実際にはHashMapオブジェクトを初期化するために使用されて見ることができます:InitialCapacityの値(初期サイズ)、loadFactor(拡張係数)を。これらの設定パラメータは、それはここでは詳細には触れませんが、複雑ではありません。

重要な詳細、すなわち、第五の方法はむしろ実施のHashMapより、のLinkedHashMapを実現使用し、そこです。そして、我々はLinkedHashSetのは、実際に挿入配列の要素を保持しているのLinkedHashMapを使用して実装された後に対処したいと思います。

コア法

HashSetのために、そのコアメソッドは以下のとおりです。削除し、追加します。

私たちは、addメソッドを見てください。

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

私たちは、直接のHashMapオブジェクトのputメソッドを呼び出すためにaddメソッドを見ることができます。設定収集インサートが成功した場合、それは、そうでない場合はfalseをtrueを返します。

その後、我々はremoveメソッドを見てください。

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

あなたは、直接法のHashMapオブジェクトを削除するには、removeメソッドを呼び出して見ることができます。あなたが正常に削除した場合、それは、そうでない場合はfalseをtrueを返します。

概要

HashSetのソースコードを直接HashMapを達成借りしている、非常に簡単です。あなたがHashMapを理解している場合ので、HashSetのはとても自然言うまでもないです。

おすすめ

転載: www.cnblogs.com/chanshuyi/p/java_collection_06_hash_set.html