我的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類似