Java集合類源碼分析(九):HashSet&LinkedHashSet

我的github:xjwhhh的github
希望大家多多關注,共同進步

Java集合類源碼分析(一):Collcetion接口
Java集合類源碼分析(二):List接口
Java集合類源碼分析(三):AbstractList類
Java集合類源碼分析(四):ArrayList&LinkedList
java集合類源碼分析(五):Map接口
Java集合類源碼分析(六):AbstractMap類
Java集合類源碼分析(七):HashMap&LinkedHashMap
Java集合類源碼分析(八):AbstractSet類
Java集合類源碼分析(九):HashSet&LinkedHashSet

HashSet源碼解析

HashSet類實現了Set。對於迭代器的順序不做保證,並且不保證隨着時間變化,順序會保持一致。HashSet類允許null元素

在元素均勻分佈的情況下,HashSet對於一些基礎操作,如add,remove,contains,size提供了常數時間的操作。用迭代器遍歷set所需要的時間與HashSet元素總數和哈希桶的數量成正比。如果遍歷速度很重要的話,不要把set的初始容量設得太高

HashSet不是同步的

HashSet中只包含鍵,不包含值,在底層具體實現時,使用的HashMap或者是LinkedHashMap(可以指定構造函數來確定使用哪種結構)

HashMap是鍵值對存儲,所以爲了適應HashMap存儲,HashSet增加了一個PRESENT類域,所有的鍵都有同一個值(PRESENT)

static final long serialVersionUID = -5024744406713321676L;

private transient HashMap<E,Object> map;

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

/**
 * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
 * default initial capacity (16) and load factor (0.75).
 */
public HashSet() {
    map = new HashMap<>();
}


public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

構建一個新的set,含有參數集合中的所有元素

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

調用map的put方法,如果set中不存在該值,即map中不存在該鍵,put返回的是null,則add返回true,如果存在,put返回的是之前的該鍵對應的值,則add返回false

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

調用map的remove方法,如果set中不存在該值,即map中不存在該鍵,map.remove返回的是null,則set.remove返回false,如果存在,map.remove返回的是之前的該鍵對應的值,則set.remove返回true

LinkedHashSet

LinkedHashSet會調用HashSet的父類構造函數,讓其底層實現爲LinkedHashMap,這樣就很好的實現了LinkedHashSet所需要的功能。

其餘與HashSet類似

發佈了43 篇原創文章 · 獲贊 27 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章