1. 程式人生 > >Java集合原始碼閱讀筆記-HashSet

Java集合原始碼閱讀筆記-HashSet

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 物件。