1. 程式人生 > >jdk原始碼淺讀-HashSet

jdk原始碼淺讀-HashSet

  通過閱讀原始碼發現,HashSet底層的實現原始碼其實就是呼叫HashMap的方法實現的,所以如果你閱讀過HashMap或對HashMap比較熟悉的話,那麼閱讀HashSet就很輕鬆,也很容易理解了。我之前也寫了一篇關於hashMap原始碼閱讀的文章,可以點選這裡檢視。

  使用過HashSet的都清楚它儲存的元素是不可以重複的,其實HashSet的元素都是儲存在HashMap的key中的,而HashMap的key是沒有重複的。

  建構函式

/**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * the specified initial capacity and the specified load factor.
     *
     * @param      initialCapacity   the initial capacity of the hash map
     * @param      loadFactor        the load factor of the hash map
     * @throws     IllegalArgumentException if the initial capacity is less
     *             than zero, or if the load factor is nonpositive
     
*/ public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); }

  HashSet的構造方法都是直接呼叫了HashMap的構造方法,HashSet有很多個構造方法全部都是直接呼叫了HashMap的構造方法。

  add方法

/**
     * Adds the specified element to this set if it is not already present.
     * More formally, adds the specified element <tt>e</tt> to this set if
     * this set contains no element <tt>e2</tt> such that
     * <tt>(e==null&nbsp;?&nbsp;e2==null&nbsp;:&nbsp;e.equals(e2))</tt>.
     * If this set already contains the element, the call leaves the set
     * unchanged and returns <tt>false</tt>.
     *
     * @param e element to be added to this set
     * @return <tt>true</tt> if this set did not already contain the specified
     * element
     
*/ public boolean add(E e) { return map.put(e, PRESENT)==null; }

  contains方法

 /**
     * Returns <tt>true</tt> if this set contains the specified element.
     * More formally, returns <tt>true</tt> if and only if this set
     * contains an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this set is to be tested
     * @return <tt>true</tt> if this set contains the specified element
     
*/ public boolean contains(Object o) { return map.containsKey(o); }

  remove方法

 /**
     * Removes the specified element from this set if it is present.
     * More formally, removes an element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>,
     * if this set contains such an element.  Returns <tt>true</tt> if
     * this set contained the element (or equivalently, if this set
     * changed as a result of the call).  (This set will not contain the
     * element once the call returns.)
     *
     * @param o object to be removed from this set, if present
     * @return <tt>true</tt> if the set contained the specified element
     */
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

 其他的方法也都是直接呼叫HashMap的方法,所以在這裡就不用貼出來了。

  2、我自己在看原始碼的時候也手寫了HashMap、HashSet等資料結構的類,大家可以下載下來參考一下,有不懂或不理解的地方可以問我,如果有什麼問題也隨時歡迎騷擾。專案地址:https://github.com/rainple1860/MyCollection