HashSet 源碼分析

在JDK1.8的文檔中是這么介紹HashSet的:此類實(shí)現(xiàn)Set接口,由哈希表(實(shí)際為HashMap實(shí)例)支持。 對(duì)集合的迭代次序不作任何保證;
這個(gè)類提供了基本操作(add,remove,contains和size)固定的時(shí)間性能,假定哈希函數(shù)將分散的桶中正確的元素。 迭代此集合需要與HashSet實(shí)例的大?。ㄔ?cái)?shù)量)和后臺(tái)HashMap實(shí)例(桶數(shù))的“容量”的總和成比例的時(shí)間。 因此,如果迭代性能很重要,不要將初始容量設(shè)置得太高(或負(fù)載因子太低)是非常重要的。
在文檔的介紹中,我們能直觀的發(fā)現(xiàn)HashSet的幾個(gè)特點(diǎn):
1.不能重復(fù)
2.不能保證添加的順序跟集合中的排序一樣
3.如果迭代性能很重要,不能把初始容量設(shè)置的太高或負(fù)載因子太低

HashSet的屬性

// 存儲(chǔ)數(shù)據(jù)的map
private transient HashMap<E,Object> map;
// HashSet中存儲(chǔ)的元素,都是Map的key,這個(gè)屬性為每個(gè)key的value
private static final Object PRESENT = new Object();

HashSet的構(gòu)造器:

public HashSet() {
    // 初始化map
    map = new HashMap<>();
}

public HashSet(Collection<? extends E> c) {
    // 傳入一個(gè)目標(biāo)集合的話,會(huì)給map一個(gè)初始容量。容量取決于 : (c.size / 0.75+1) > 16 ? (c.size / 0.75+1) : 16 
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

public boolean addAll(Collection<? extends E> c) {
    boolean modified = false;
    for (E e : c)
        if (add(e))
            modified = true;
    return modified;
}

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

HashSet(Collection<? extends E> c):構(gòu)建一個(gè)包含目標(biāo)集的HashSet, HashMap的初始容量根據(jù)目標(biāo)集大小來定,加載因子為HashMap 的默認(rèn)大小 0.75,然后對(duì)for循環(huán)添加進(jìn)HashMap中(關(guān)于是怎么添加的,這個(gè)寫HashMap的再說)。

add(E e): 添加元素

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

remove(Object o): 刪除元素

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

算了算了~~整個(gè)HashSet 都是根據(jù)HashMap來實(shí)現(xiàn)的,其實(shí)我應(yīng)該先寫HashMap的。算了,就當(dāng)是自己看過HashSet的一個(gè)痕跡吧 -_-||

總結(jié):
1.HashSet 不會(huì)產(chǎn)生重復(fù)的元素
2.HashSet 的元素序列不是按照添加的順序
(就不寫什么添加啊刪除的效率高了,屁都沒看就說效率高,太扯蛋了 ==)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容