Java集合原始碼閱讀筆記-HashSet
阿新 • • 發佈:2019-02-16
HashSet
對於HashSet而言,它是基於HashMap來實現的,底層採用HashMap來儲存元素。所以如果對HashMap比較熟悉,那麼理解HashSet就比較容易
Set介面是一種不包括重複元素的Collection,它維持它自己的內部排序,所以隨機訪問沒有任何意義,基本屬性如下:
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
// 使用 HashMap 的 key 儲存 HashSet 中所有元素
private transient HashMap<E,Object> map;
// 定義一個虛擬的 Object 物件作為 HashMap 的 value
private static final Object PRESENT = new Object();
...
// 初始化 HashSet,底層會初始化一個 HashMap
public HashSet()
{
map = new HashMap<E,Object>();
}
// 以指定的 initialCapacity、loadFactor 建立 HashSet
// 其實就是以相應的引數建立 HashMap
public HashSet(int initialCapacity, float loadFactor)
{
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity)
{
map = new HashMap<E,Object>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy)
{
map = new LinkedHashMap<E,Object>(initialCapacity
, loadFactor);
}
// 呼叫 map 的 keySet 來返回所有的 key
public Iterator<E> iterator()
{
return map.keySet().iterator();
}
// 呼叫 HashMap 的 size() 方法返回 Entry 的數量,就得到該 Set 裡元素的個數
public int size()
{
return map.size();
}
// 呼叫 HashMap 的 isEmpty() 判斷該 HashSet 是否為空,
// 當 HashMap 為空時,對應的 HashSet 也為空
public boolean isEmpty()
{
return map.isEmpty();
}
// 呼叫 HashMap 的 containsKey 判斷是否包含指定 key
//HashSet 的所有元素就是通過 HashMap 的 key 來儲存的
public boolean contains(Object o)
{
return map.containsKey(o);
}
// 將指定元素放入 HashSet 中,也就是將該元素作為 key 放入 HashMap
public boolean add(E e)
{
return map.put(e, PRESENT) == null;
}
// 呼叫 HashMap 的 remove 方法刪除指定 Entry,也就刪除了 HashSet 中對應的元素
public boolean remove(Object o)
{
return map.remove(o)==PRESENT;
}
// 呼叫 Map 的 clear 方法清空所有 Entry,也就清空了 HashSet 中所有元素
public void clear()
{
map.clear();
}
...
}
由上面源程式可以看出,HashSet 的實現其實非常簡單,它只是封裝了一個 HashMap 物件來儲存所有的集合元素,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來儲存,而 HashMap 的 value 則儲存了一個 PRESENT,它是一個靜態的 Object 物件。