HashSet源碼解析

原文地址:http://www.cnblogs.com/java-zhao/p/5110953.html

1、對於HashSet需要掌握以下幾點

  • HashSet的創建:HashSet()
  • 往HashSet中添加單個對象:即add(E)方法
  • 刪除HashSet中的對象:即remove(Object key)方法
  • 判斷對象是否存在於HashSet中:containsKey(Object key)

 注:HashSet沒有獲取單個對象的方法,需要使用iterator

 

2、構建HashSet

 源代碼:

    //HashSet底層數據結構:通過hashmap的key不可重複的原則,使得存放入HashSet中的值不重複
    private transient HashMap<E, Object> map;
    //默認的hashmap的value
    private static final Object PRESENT = new Object();
    /**
     * 可存放16個元素
     */
    public HashSet() {
        map = new HashMap<E, Object>();
    }
    /**
     * 指定hashset的容量和負載因子
     */
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<E, Object>(initialCapacity, loadFactor);
    }
    /**
     * 指定hashset的容量
     */
    public HashSet(int initialCapacity) {
        map = new HashMap<E, Object>(initialCapacity);
    }

注:HashSet的底層是HashMap,其依靠HashMap的key不可重複,來保證將來加入到HashSet中的元素也不重複(會將元素作爲key放到hashmap中,參照3)。

 

3、add(E e)

源代碼:

add(E e)


    /**
     * 往set中添加值
     */
    public boolean add(E e) {
        //查看hashmap的put方法,若覆蓋已有key的舊值,會返回舊值;若沒有相應的key則返回null
        return map.put(e, PRESENT) == null;
    }

注意:這裏調用了HashMap的put(K key, V value)

 

4、remove(Object key)

源代碼:

    /**
     * 刪除指定元素
     */
    public boolean remove(Object o) {
        return map.remove(o) == PRESENT;
    }

注:這裏調用了HashMap的remove(Object key)

 

5、contains(Object key)

源代碼:

    /**
     * set中是否包含指定元素
     */
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

注意:這裏調用了HashMap的containsKey(Object key)

 

總結:

  • HashSet底層就是HashMap
  • 其依靠HashMap的key不可重複,來保證將來加入到HashSet中的元素也不重複(會將元素作爲key放到hashmap中)
  • HashSet線程不安全
發佈了58 篇原創文章 · 獲贊 32 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章