HashSet
是一個可存儲不重複元素的容器,底層實現依賴 HashMap
,因此在添加,刪除,查找元素時的時間複雜度均爲 O(1).函數
HashMap
public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor); } public HashSet(int initialCapacity) { map = new HashMap<>(initialCapacity); }
private static final Object PRESENT = new Object();
爲 value存入HashMap中。當沒有元素時候,返回true,已存在,返回false。public boolean add(E e) { return map.put(e, PRESENT)==null; }
public boolean remove(Object o) { return map.remove(o)==PRESENT; }
public void clear() { map.clear(); }
public boolean isEmpty() { return map.isEmpty(); }
public boolean contains(Object o) { return map.containsKey(o); }
*Iteratorcode
public Iterator<E> iterator() { return map.keySet().iterator(); }
構造函數:繼承
HashSet(int initialCapacity, float loadFactor, boolean dummy) { map = new LinkedHashMap<>(initialCapacity, loadFactor); } public LinkedHashSet(int initialCapacity) { super(initialCapacity, .75f, true); } public LinkedHashSet() { super(16, .75f, true); }
因此說,LinkedHashSet 仍是使用LinkedHashMap實現的。ci
HashSet
就是在HashMap
基礎上一個簡單的封裝,因爲Set
的特性,它故意屏蔽了一些不須要的功能,好比 putIfAbsent
。這樣便可以保證數據類型爲Set
,可是內部不保證有序。畢竟 hash不是有序的。因此說,仍是得去看HashMap
的源碼啊。rem