[源碼分析]HashSet 和LinkedHashSet

特性

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);
    }

基礎方法

  • add ,因爲 HashSet只存儲單個值,因此,內部以值爲Key,private static final Object PRESENT = new Object();爲 value存入HashMap中。當沒有元素時候,返回true,已存在,返回false。
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
  • remove
public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }
  • clear
public void clear() {
        map.clear();
    }
  • isEmpty
public boolean isEmpty() {
        return map.isEmpty();
    }
  • contains ,就是判斷 HashMap 中的 Key 存不存在,Key能夠爲NULL
public boolean contains(Object o) {
        return map.containsKey(o);
    }

*Iteratorcode

public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

LinkedHashSet 繼承 HashSet

構造函數:繼承

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

相關文章
相關標籤/搜索