HashSet

Base:JDK1.8

一、HashSet

前面說完了HashMap,說HashSet就很好說了,由於HashSet也是一個 哈希表組成的,更直接的說,它的底層是直接使用了 HashMap 作的。java

HashSet 內容挺少的。算法

因此在這個上面就不寫那麼多了,重要的 都在HashMap 裏面,不過做爲二者的區別 ,仍是要說的。數組

二、繼承的類和實現的接口

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

 能夠看出, HashSet 是 實現了set 接口,那麼看下set 接口:數據結構

public interface Set<E> extends Collection<E>

set接口 則是繼承 Collection 接口的,所以它 是跟 List  是兄弟,跟Map 沒啥關係,都是集合。性能

不過要知道的是 List  是一個 有序的 集合,而HashSet 是一個無序的集合。url

在這裏 要知道, 有序 無序,並非指的 排序,而是指的  存入順序,有一個存入前後的 概念,而set 是沒有的。spa

上面都是基於數據結構說的,HashMap也是無序的。.net

所以,在HashSet中是沒有 get() 這種方法的。code

三、HashMap中的成員變量、數據結構、經常使用方法

3.1 成員變量

private transient HashMap<E,Object> map;

你看,底層數組直接使用的就是 HashMap。。。排序

你們注意第二個是Object,第一個是泛型

// Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

這是一個 final 修飾的 Object 的常量。  咱們都知道,HashMap 是基於 K-V形式

而 set 存的時候只放入一個 value ,那剩餘的一個怎麼辦呢? 其實就是直接使用的這個常量代替的。

固然  我說的value  意思是  你把你存儲的 東西當作是一個 value ,而在底層 ,則是將你存入的數據做爲 Key值,而這個常量 Object 做爲一個Value 存起來。

這個後面會用代碼展示。

3.2 數據結構

private transient HashMap<E,Object> map;

這就很明顯了, 是HashMap 的 數據結構。

3.3 經常使用方法

3.3.1 構造方法

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


    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
    }

這幾個構造方法直接全放一塊兒吧,很簡單。

3.3.2 add

public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

這段代碼 很天然的顯示出了, put的時候, 你存入的數據做爲一個key 值存入,而那個常量則做爲一個 value 值存入。

這就形成了,set 不能存重複的東西,由於 HashMap 的 key 值是不能重複的。

3.3.3 get

固然,是沒有get方法的。哈哈哈

3.3.4 remove

public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

 

微總結:

ArrayList、LinkedList、HashSet 是都是來自Collection 的子類, 而HashMap 則是Map 的子類

所以這是須要主意的一點

ArrayList、LinkedList 是兩個有序的,這 有序是 能夠保存 存入時候的順序,即在 不適用 add(v,index),代表插入下表的話,順序就是保存的順序,

而HashSet 、HashMap 則不在乎 存入的順序,由於會進行hash 算法,求取一個 index 放入到 哈希表中

而HashSet 又跟HashMap 正好有點相反的意思,雖然 HashSet 是基於HashMap 可是一個 HashSet 是把你存入的數據當作一個 key 存進去, HashMap則是 把存入的數據做爲 value 存入。

HashMap 是 key值 不能相同  所以決定了 HashSet  不能存重複的值。

HashMap 計算的 哈希值 是你存入的 key 的哈希值,而HashSet  則是 使用的你 傳入的 數據 計算的Hash值的,其實都是使用的key啦。。。。

ArrayList 跟 LinkedList 的性能有點一邊倒。一個注重查詢,一個注重插入,刪除,固然: 數據量大。。。

若是你都是插入到最後,查詢的都是 第一個,幾乎是沒有差距。。

HashSet 跟HashMap 二者都不能重複。第一個是 你存的數據不能是重複的, 第二個是 你存入的 key 值是不能重複。

HashMap 更重要,並且 據我如今的瞭解,貌似 key-value 形式 很是很是很是的常見,並且重要,用到的地方很是多。

 

-----------------------------------------------------------------------------

不保證代碼徹底正確,也不保證代碼是最優。

僅僅是根據本身的理解,寫出來直觀的代碼,方便理解。

錯誤請指出,感激涕零!

相關文章
相關標籤/搜索