JAva集合——Set実装クラスのHashSet

3464 ワード

ソースコードjdk 1.7.81に基づく
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を返します.