Java集合(五) —— HashSet源碼分析

Java集合(一) —— Collection源碼分析
Java集合(二) —— ArrayList源碼分析
Java集合(三) —— LinkedList源碼分析
Java集合(四) —— PriorityQueue源碼分析
Java集合(五) —— HashSet源碼分析
Java集合(六) —— LinkedHashSet源碼分析
Java集合(七) —— TreeSet源碼分析
Java集合(八) —— HashMap源碼分析
Java集合(九) —— LinkedHashMap源碼分析
Java集合(十) —— TreeMap源碼分析

0.總結(稍微改變一下把敢,先來個總體概括)

1.HashSet內部是使用HashMap來存儲數據的雀监,具體來說是使用HashMap中的key存儲數據的(這就是HashSet不能存儲重復的元素的原因)罐盔,而HashMap中所有的值存儲的都將是PRESENT對象(PRESENT對象是在類加載時就已經初始化好了悼粮,并且不允許改變的)兢仰。
2.HashSet對外提供的方法噪馏,最終都是通過HashMap操作完成的痊末。
3.HashSet不能保存重復的元素(前面已經說過了)绪钥。
4.HashSet不保證插入的順序(通過hash()函數將對象映射到散列表(實際就是數組)中,所以數據在數組中不是連續(xù)存儲的)云芦。
5.HashSet的默認容量是16(事實上是HashMap的默認容量)俯逾,負載因子為0.75,也就是說默認當元素數量達到16*0.75=12之后就會發(fā)生擴容舅逸。

1.HashSet繼承關系圖

HashSet.png

2.數據結構

// HashSet使用的是HashMap存儲數據桌肴,至于HashMap的數據結構,會在HashMap一章中詳解
private transient HashMap<E,Object> map;

3.源碼分析

3.1成員變量

// HashSet用于保存數據的HashMap
private transient HashMap<E,Object> map;
// PRESENT是map默認存儲的value琉历,基本上沒什么用坠七,我們應該也不會用到
private static final Object PRESENT = new Object();

3.2構造方法

/**
 * 默認構造方法
 */
public HashSet() {
    // 使用map存儲數據
    map = new HashMap<>();
}

/**
 * 使用指定集合構建HashSet
 */
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);
}

3.3常用方法

1.新增元素add

public boolean add(E e) {
    // 實際上調用了map的put()方法保存數據;這里不再展開HashMap的源碼
    return map.put(e, PRESENT)==null;
}

圖解HashSet(HashMap)存儲數據的過程

HashSet_HashMap存儲.png

2.刪除元素

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

4.Tips

其實HashSet并沒有什么好說的,因為處理數據時灼捂,其內部基本都是調用HashMap的方法离例。我們只需要知道HashSet不能保存重復元素,不保證元素順序等特性就夠了(其實這些還是HashMap的特性)悉稠。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末宫蛆,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子的猛,更是在濱河造成了極大的恐慌耀盗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦尊,死亡現場離奇詭異叛拷,居然都是意外死亡,警方通過查閱死者的電腦和手機岂却,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門忿薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躏哩,你說我怎么就攤上這事署浩。” “怎么了扫尺?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵筋栋,是天一觀的道長。 經常有香客問我正驻,道長弊攘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任姑曙,我火速辦了婚禮襟交,結果婚禮上,老公的妹妹穿的比我還像新娘渣磷。我一直安慰自己婿着,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布醋界。 她就那樣靜靜地躺著,像睡著了一般提完。 火紅的嫁衣襯著肌膚如雪形纺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天徒欣,我揣著相機與錄音逐样,去河邊找鬼。 笑死,一個胖子當著我的面吹牛脂新,可吹牛的內容都是我干的挪捕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼争便,長吁一口氣:“原來是場噩夢啊……” “哼级零!你這毒婦竟也來了?” 一聲冷哼從身側響起滞乙,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤奏纪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斩启,有當地人在樹林里發(fā)現了一具尸體序调,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年兔簇,在試婚紗的時候發(fā)現自己被綠了发绢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡垄琐,死狀恐怖朴摊,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情此虑,我是刑警寧澤甚纲,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站朦前,受9級特大地震影響介杆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜韭寸,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一春哨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恩伺,春花似錦赴背、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褒脯,卻和暖如春便瑟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背番川。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工到涂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脊框,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓践啄,卻偏偏與公主長得像浇雹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屿讽,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350