JAVA集合系列之-HashSet
阿新 • • 發佈:2021-08-20
1. HashSet 簡介
- HashSet 是個包裝HashMap的一種資料結構,HashSet的大部分的方法都是依靠找HashMap的方法,在內部結構沒有特別複雜的實現,在方法的實現中沒有synchronized關鍵字修飾,所以是執行緒不安全的
- HashSet繼承了AbstractMap、實現了Map、Cloneable、Serializable介面
- 繼承了AbstractMap的介面,HashSet就有了增、刪、改、查、判空、迭代器等功能
- 實現了Cloneable介面則說明HashSet支援Object的clone的方法,如果不繼承呼叫clone方法會丟擲CloneNotSupportedException的錯誤,看了下原始碼,是native方法實現的
- 實現了Serializable介面則說明HashSet能夠被序列化和反序列化,能夠在網路中進行傳輸
2. HashSet 資料結構
HashSet的繼承關係
java.lang.Object ↳ java.util.Map<E> ↳ java.util.AbstractMap<E> ↳ java.util.HashSet<E> public class HashMap<K,V> extends AbstractMap<K,V> implementsMap<K,V>, Cloneable, Serializable {}
3. HashSet 主要方法說明
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 的 valueprivate 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(); } ... }
4. HashSet 總結
- 內部實現是使用HashMap進行實現,
- 執行緒不安全
- 存放資料是無序的
- 存放的資料是唯一的