HashSet實現(xiàn)原理

HashMap的實現(xiàn)原理中,詳細(xì)地介紹了HashMap的實現(xiàn)纠亚。那么你可能會問:這跟HashSet有什么關(guān)系蝶糯?

HashSet簡述

HashSet中不允許有重復(fù)元素,這是因為HashSet是基于HashMap實現(xiàn)的样眠,HashSet中的元素都存放在HashMap的key上面,而value中的值都是統(tǒng)一的一個private static final Object PRESENT = new Object();翠肘。HashSet跟HashMap一樣檐束,都是一個存放鏈表的數(shù)組。

現(xiàn)在知道了二者的關(guān)系了束倍,我們分析一下HashSet的源碼:

HashSet的構(gòu)造

對于HashSet而言被丧,它是基于HashMap實現(xiàn)的,HashSet底層使用HashMap來保存所有元素肌幽,更確切的說晚碾,HashSet中的元素,只是存放在了底層HashMap的key上喂急, 而value使用一個static final的Object對象標(biāo)識格嘁。因此HashSet 的實現(xiàn)比較簡單,相關(guān)HashSet的操作廊移,基本上都是直接調(diào)用底層HashMap的相關(guān)方法來完成

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;
    private static final Object PRESENT = new Object();

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

通過源碼糕簿,很容易地看出來HashSet是由HashMap構(gòu)造而成探入。

HashSet操作

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

    public int size() {
        return map.size();
    }

    public boolean isEmpty() {
        return map.isEmpty();
    }

    public boolean contains(Object o) {
        return map.containsKey(o);
    }

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

HashSet的操作基本上都是由HashMap來實現(xiàn)的。

總結(jié)

HashSet底層由HashMap實現(xiàn)
HashSet的值存放于HashMap的key上
HashMap的value統(tǒng)一為PRESENT

參考

JDK API:HashSet

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懂诗,一起剝皮案震驚了整個濱河市蜂嗽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殃恒,老刑警劉巖植旧,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異离唐,居然都是意外死亡病附,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門亥鬓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來完沪,“玉大人,你說我怎么就攤上這事嵌戈「不” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵熟呛,是天一觀的道長宽档。 經(jīng)常有香客問我,道長惰拱,這世上最難降的妖魔是什么雌贱? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮偿短,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馋没。我一直安慰自己昔逗,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布篷朵。 她就那樣靜靜地躺著勾怒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪声旺。 梳的紋絲不亂的頭發(fā)上笔链,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音腮猖,去河邊找鬼鉴扫。 笑死,一個胖子當(dāng)著我的面吹牛澈缺,可吹牛的內(nèi)容都是我干的坪创。 我是一名探鬼主播炕婶,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莱预!你這毒婦竟也來了柠掂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤依沮,失蹤者是張志新(化名)和其女友劉穎涯贞,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體危喉,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡肩狂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姥饰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻谁。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖列粪,靈堂內(nèi)的尸體忽然破棺而出审磁,到底是詐尸還是另有隱情,我是刑警寧澤岂座,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布态蒂,位于F島的核電站,受9級特大地震影響费什,放射性物質(zhì)發(fā)生泄漏钾恢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一鸳址、第九天 我趴在偏房一處隱蔽的房頂上張望瘩蚪。 院中可真熱鬧,春花似錦稿黍、人聲如沸疹瘦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽言沐。三九已至,卻和暖如春酣栈,著一層夾襖步出監(jiān)牢的瞬間险胰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工矿筝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留起便,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像缨睡,于是被迫代替她去往敵國和親鸟悴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容