1. 程式人生 > 其它 >JAVA集合系列之-HashSet

JAVA集合系列之-HashSet

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>
    implements
Map<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 的 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(); } ... }

4. HashSet 總結

  • 內部實現是使用HashMap進行實現,
  • 執行緒不安全
  • 存放資料是無序的
  • 存放的資料是唯一的