HashSet源碼

1、HashSet介紹

與HashMap類似,字面上看,HashSet由兩個單詞組成:HashSet。其中,Set表示接口,實現Set接口也有多種方式,各有特點,HashSet實現的方式利用了Hash

Set public interface Set<E> extends Collection<E> {

表示容器沒有重複元素、且不保證順序的容器接口,它擴展了Collection,但沒有定義任何新的方法、

無順序,不重複

與`HashMap類似,HashSet要求元素重寫hashCode和equals方法,且對於兩個對象,如果equals相同,則hashCode也必須相同,如果是自定義的類,需要注意這一點

HashSet的應用場景

  • 排重
  • 保存特殊值
  • 集合運算

底層就是一個HashMap

2、構造函數

HashSet的內部是用HashMap實現的,它內部有一個HashMap實例變量

同時,這個HashMap所有鍵對應的值固定

  //HashSet內部使用HashMap實現,它的內部有一個HashMap實例變量
    private transient HashMap<E,Object> map;

//Map有鍵和值,HashSet相當於只有鍵,都是相同的固定值,
    private static final Object PRESENT = new Object();

HashSet的構造方法,主要就是調用了對應的HashMap的構造方法

2.1、HashSet

 public HashSet() {
        map = new HashMap<>();
    }

2.2public HashSet(int initialCapacity, float loadFactor) {

   public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

2.3、public HashSet(int initialCapacity) {

   public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

2.4、 public HashSet(Collection<? extends E> c) {

    public HashSet(Collection<? extends E> c) {
        // c.size()/0.75用於計算initialCapacity,0.75f是loadFactor的默認值
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        //添加元素
        addAll(c);
    }

3、add方法

    public boolean add(E e) {
        //就是map調用的put元素,元素e用於鍵,值就是固定的PRESENT,
        // put返回null表示原來沒有對應的鍵,添加成功了。
        return map.put(e, PRESENT)==null;
    }

4、remove方法

    public boolean remove(Object o) {
        //就是調用map的remove方法,返回值爲PRESENT表示原來有對應的鍵且刪除成功
        return map.remove(o)==PRESENT;
    }

5、contains

    public boolean contains(Object o) {
        //就是檢查map中是否包含對應的鍵
        return map.containsKey(o);
    }

6、小結

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vVuy0RCe-1582541662696)(images/06.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章