HashSetの実現原理


1.    HashSetの概要:   HashSetは、ハッシュ・テーブル(実際にはHashMapの例である)によってサポートされるSetインターフェースを実現する.setの反復順序は保証されていません.特に、この順序が恒久的に変わることは保証されていません.このクラスではnull要素を使用できます.2.    HashSetの実装:
   HashSetについては、HashMapに基づいて実装され、HashSetの下位層はHashMapを使用してすべての要素を保存するため、HashSetの実装は比較的簡単であり、関連するHashSetの動作は、基本的には下位層HashMapの関連方法を直接呼び出して完了する.HashSetのソースコードは以下の通りである.
public class HashSet<E>
	    extends AbstractSet<E>
	    implements Set<E>, Cloneable, java.io.Serializable
	{
	    static final long serialVersionUID = -5024744406713321676L;
	 
	    //     HashMap   HashSet     。
	    private transient HashMap<E,Object> map;
	     
	    //        Object    HashMap value,       static final。
	    private static final Object PRESENT = new Object();
	 
	    /**
	     *         ,      HashSet。
	     *
	     *             HashMap,          16     0.75。
	     */
	    public HashSet() {
	        map = new HashMap<E,Object>();
	    }
	 
	    /**
	     *         collection      set。
	     *
	     *              0.75       
	     * collection               HashMap。
	     * @param c           set  collection。
	     */
	    public HashSet(Collection<? extends E> c) {
	        map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
	        addAll(c);
	    }
	 
	    /**
	     *     initialCapacity loadFactor      HashSet。
	     *
	     *                 HashMap。
	     * @param initialCapacity     。
	     * @param loadFactor     。
	     */
	    public HashSet(int initialCapacity, float loadFactor) {
	        map = new HashMap<E,Object>(initialCapacity, loadFactor);
	    }
	 
	    /**
	     *     initialCapacity      HashSet。
	     *
	     *                loadFactor 0.75      HashMap。
	     * @param initialCapacity     。
	     */
	    public HashSet(int initialCapacity) {
	        map = new HashMap<E,Object>(initialCapacity);
	    }
	 
	    /**
	     *     initialCapacity loadFactor             。
	     *            ,     ,      LinkedHashSet   。
	     *
	     *                 LinkedHashMap     。
	     * @param initialCapacity     。
	     * @param loadFactor     。
	     * @param dummy   。
	     */
	    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
	        map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
	    }
	 
	    /**
	     *     set           。             。
	     *
	     *         HashMap keySet      key。
	     *   HashSet    ,        HashMap key ,
	     * value    static final Object    。
	     * @return   set        Iterator。
	     */
	    public Iterator<E> iterator() {
	        return map.keySet().iterator();
	    }
	 
	    /**
	     *    set       (set   )。
	     *
	     *       HashMap size()    Entry   ,    Set      。
	     * @return  set       (set   )。
	     */
	    public int size() {
	        return map.size();
	    }
	 
	    /**
	     *    set       ,   true。
	     *
	     *       HashMap isEmpty()   HashSet    。
	     * @return    set       ,   true。
	     */
	    public boolean isEmpty() {
	        return map.isEmpty();
	    }
	 
	    /**
	     *    set      ,   true。
	     *      ,     set      (o==null ? e==null : o.equals(e))
	     *  e   ,  true。
	     *
	     *       HashMap containsKey        key。
	     * @param o   set            。
	     * @return    set      ,   true。
	     */
	    public boolean contains(Object o) {
	        return map.containsKey(o);
	    }
	 
	    /**
	     *    set         ,       。
	     *      ,    set       (e==null ? e2==null : e.equals(e2))
	     *    e2,   set        e。
	     *    set      ,       set   false。
	     *
	     *            key  HashMap。
	     *   HashMap put()    key-value  ,    HashMap Entry key
	     *       Entry key  (hashCode()     ,  equals     true),
	     *     Entry value      Entry value, key       ,
	     *      HashSet             ,              HashMap ,
	     *              ,      Set         。
	     * @param e      set    。
	     * @return    set        ,   true。
	     */
	    public boolean add(E e) {
	        return map.put(e, PRESENT)==null;
     }
	 
     /**
	     *           set ,     。
	     *      ,   set      (o==null ? e==null : o.equals(e))   e,
	     *      。   set      ,   true
	     * (  :   set        ,   true)。(      ,  set       )。
	     *
	     *       HashMap remove      Entry。
	     * @param o       set           。
	     * @return   set      ,   true。
	     */
	    public boolean remove(Object o) {
	        return map.remove(o)==PRESENT;
	    }
	 
	    /**
	     *   set       。      , set   。
	     *
	     *       HashMap clear    Entry     。
	     */
	    public void clear() {
	        map.clear();
	    }
	 
	    /**
	     *    HashSet       :           。
	     *
	     *       HashMap clone()  ,  HashMap     ,    HashSet 。
	     */
	    public Object clone() {
	        try {
	            HashSet<E> newSet = (HashSet<E>) super.clone();
	            newSet.map = (HashMap<E, Object>) map.clone();
	            return newSet;
	        } catch (CloneNotSupportedException e) {
	            throw new InternalError();
	        }
	    }
	}