JAva集合——Set実装クラスのHashSet
ソースコードjdk 1.7.81に基づく
HashSetの概要
HashSetは要素が重複できない集合です.
HashSetで追加した要素が重複している場合、追加に失敗します.
HashSetはSetの実装クラスであり、SetはCollectionメソッドを継承し、余分なメソッドを追加していない.
HashSetはAbstractSetクラスを継承しています.
Cloneableインタフェースが実装され、クローン化できるclone()メソッドが書き換えられていることを示します.
Java.io.Serializableインタフェースが実装され、シーケンス化できることを示します.
HashSetメンバー変数
mapはキー値ペアを格納しており,ここではそのkeyのみを用い,Objectはそのvalueに値を付与するために用いられる.したがって、HashSetはHashMapのすべての特性を有し、配列にチェーンテーブルを加えたデータ構造であり、各key値は一意であり、HashSetにはその値が一意であることが示されている.
HashSetのコンストラクタ
HashSetの構造方法はすべてHashMapを呼び出す構造方法であり,HashSetを学習する際にHashMapと照らし合わせて学習することができる.
HashSetの反復器
HashSetの反復器は,HashMapがキーを介して巡回するように呼び出された反復器である.
HashSetの基本操作
追加された要素がすでにセットに存在する場合、putメソッドは元のvalue値を返し、addメソッドではputメソッドが返すoldvalue値!=null、falseを返すと追加に失敗します.
追加された要素がセットに存在しない場合、mapに要素を追加しnullを返します.
HashSetの概要
HashSetは要素が重複できない集合です.
HashSetで追加した要素が重複している場合、追加に失敗します.
HashSetはSetの実装クラスであり、SetはCollectionメソッドを継承し、余分なメソッドを追加していない.
HashSetはAbstractSetクラスを継承しています.
Cloneableインタフェースが実装され、クローン化できるclone()メソッドが書き換えられていることを示します.
Java.io.Serializableインタフェースが実装され、シーケンス化できることを示します.
public class HashSet
extends AbstractSet
implements Set, Cloneable, java.io.Serializable
HashSetメンバー変数
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap map;
private static final Object PRESENT = new Object();
mapはキー値ペアを格納しており,ここではそのkeyのみを用い,Objectはそのvalueに値を付与するために用いられる.したがって、HashSetはHashMapのすべての特性を有し、配列にチェーンテーブルを加えたデータ構造であり、各key値は一意であり、HashSetにはその値が一意であることが示されている.
HashSetのコンストラクタ
//
public HashSet() {
map = new HashMap();
}
// Collection
public HashSet(Collection extends E> c) {
// map。
// Math.max((int) (c.size()/.75f) + 1, 16), (c.size()/.75f) + 1 16 ?
// , (c.size()/.75f) + 1
// HashMap ( ) ,HashMap 0.75。
// HashMap “ ”( =HashMap * ) < “HashMap ” ,
// HashMap 。
// ,(c.size()/.75f) + 1 。
// , 16 。
// HashMap , 2 。 HashMap , 2 ;
// HashMap , “ ” 2 。
// , 16 。 。
map = new HashMap(Math.max((int) (c.size()/.75f) + 1, 16));
// c map 。
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);
}
HashSetの構造方法はすべてHashMapを呼び出す構造方法であり,HashSetを学習する際にHashMapと照らし合わせて学習することができる.
HashSetの反復器
// HashSet
public Iterator iterator() {
return map.keySet().iterator();
}
HashSetの反復器は,HashMapがキーを介して巡回するように呼び出された反復器である.
HashSetの基本操作
/*
*
*
* key null
*
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;// HashMap add
}
public V put(K key, V value) {
// key null
if (key == null)
return putForNullKey(value);
// hash
int hash = hash(key.hashCode());
//
int i = indexFor(hash, table.length);
//
for (Entry e = table[i]; e != null; e = e.next) {
Object k;
// key,
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
//
addEntry(hash, key, value, i);
return null; // , null.
}
追加された要素がすでにセットに存在する場合、putメソッドは元のvalue値を返し、addメソッドではputメソッドが返すoldvalue値!=null、falseを返すと追加に失敗します.
追加された要素がセットに存在しない場合、mapに要素を追加しnullを返します.