【JDK1.8源碼閱讀】HashSet.class(完)

你應該瞭解:
0、HashSet本質還是hashmap,只不過把hashmap的value統一設置爲PRESENT
1、源碼閱讀順序(建議):hashtable→hashmap→hashset
2new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));每一個參數的含義
3、如何插入和刪除一個元素
4、線程不安全



繼承

  • HashSet繼承AbstractSet抽象類和實現Set、Cloneable、Serializable接口。
//AbstractSet實際就4個函數方法,都是常規的。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
	protected AbstractSet() {
    }
    public boolean equals(Object o) {
        ***
    }
    public int hashCode() {
        ***
    }
    public boolean removeAll(Collection<?> c) {
        ***
    }
    }

內置元素

  • 底層以HashMap來實現,set就是map的key,然後將map的value統一格式化爲PRESENT。
static final long serialVersionUID = -5024744406713321676L;

	private transient HashMap<E, Object> map;

	// Dummy value to associate with an Object in the backing Map
	//HashSet本質還是hashmap,只不過把hashmap的value統一設置爲PRESENT
	private static final Object PRESENT = new Object();

	/**
	 * default initial capacity (16) and load factor (0.75).新建HashMap
	 */
	public HashSet() {
		map = new HashMap<>();
	}

		/**
		*爲什麼要調用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 計算出來的正好是總的空間大小。
		**/
	public HashSet(Collection<? extends E> c) {
		map = new HashMap<>(Math.max((int) (c.size() / .75f) + 1, 16));
		addAll(c);
	}


如何添加一個元素

  • hashset將map的value設置爲PRESENT然後調用hashmap來創建。
public boolean add(E e) {
		return map.put(e, PRESENT) == null;
	}

//V put來自hashmap
 public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

如何刪除一個元素

  • object o就是map裏面的key,將他傳到hashmap去刪除就可以,無需理會value,只有返回時以value來判斷是否刪除成功。
public boolean remove(Object o) {
		return map.remove(o) == PRESENT;
	}

//V remove來自hashmap,刪除成功返回value,也就是上面的PRESENT
 public V remove(Object key) {
        Node<K,V> e;
        return (e = removeNode(hash(key), key, null, false, true)) == null ?
            null : e.value;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章