- HashSet 在很多面試中都是一個高頻的考點。那么我們看看HashSet面試都問什么?
-
面試官常問你HashSet的底層數(shù)據(jù)結(jié)構(gòu)是什么灌具? HashMap ,這個 時候面試官又問HashMap 怎么能對呢? HashMap 是<k,v >的數(shù)據(jù)結(jié)構(gòu)啊捣鲸,而HashSet 是一個v的數(shù)據(jù)結(jié)構(gòu)啊瑟匆,這個時候面試官會說我覺得你對源碼了解的不多。但是其實頂層就是HashMap的數(shù)據(jù)結(jié)構(gòu)栽惶,用HashMap的key去保存Set中的值愁溜,而HashMap中的V是一個Object對象常量 (如下圖中的源碼)。這個時候面試官又會問哪為什么用Object 對象呢外厂?用Null不是更好嘛冕象?
-
接下來我們就分析分析為什么使用Object 對象而不是用Null。這也要看源碼了汁蝶,這和remove(Object o)方法有關(guān)渐扮。因為我們知道HashSet底層使用的是HashMap论悴,所有remove也是調(diào)用HashMap方法的,我們既然要使用remove方法墓律,我們也看到了boolean 這個返回值膀估,這就要求我們需要返回一個boolean值,那么如果我們設(shè)置的值不是Object 對象而是Null的話耻讽,使用remove方法移除那個值就判斷不出來到底刪除成功還是沒有成功了察纯。所以不能使用Null。
-
- 如果你仔細看源碼里面的方法针肥,你會發(fā)現(xiàn)很多方法都是調(diào)用HashMap中的方法(詳細請看Java之HashMap的底層原理:面試潮牵考知識點
) 。如下等等慰枕。
-
其實HashSet就是低配版本的HashMap,這就是為什么HashMap 這么重要的一個原因具则。當我們看LinkedHashMap源碼的時候發(fā)現(xiàn)底層就是HashSet,那么HashSet底層是LinkedHashMap捺僻,那么大膽的猜測一下LinkedHashMap是不是HashMap.沒錯我們猜對了乡洼。
-
同HashSet相比并沒有實現(xiàn)新的功能(新的方法),只不過把HashSet中預(yù)留的構(gòu)造方法啟用了匕坯,因而可以實現(xiàn)有序插入束昵,而這個具體的實現(xiàn)要去看LinkedHashMap了,我們使用時是不需要再可以去設(shè)置參數(shù)的葛峻,直接拿來用就行了锹雏。
- 看上面accessOrder = false;這個是給構(gòu)造器的一個參數(shù),告訴構(gòu)造器使用插入的順序术奖。
-
- 線程安全的Set
- Collections.synchronizedSet(new HashSet());
- new CopyOnWriteArraySet<>(); 寫時復(fù)制技術(shù)的線程安全類詳細參考Java之ArrayList的底層原理:面試辰缸瘢考考點中有講解寫時復(fù)制是如何保證性能安全而且還效率比較高。
- 總結(jié)
- HashSet采记、LinkHashSet佣耐、TreeSet的迭代遍歷順序是怎樣的呢?
- Set是沒有g(shù)et()方法的唧龄,是通過map的iterator迭代器遍歷的兼砖。
- LinkHashSet迭代順序也是按照插入順序遍歷的,底層是有一個變量accessOrder = false既棺,這是給HashSet迭代器的一個參數(shù)讽挟,才使它也是根據(jù)插入順序迭代順序輸出的。
- TreeSet中存放的元素是有序的(不是插入時的順序丸冕,是有按關(guān)鍵字大小排序的)耽梅,且元素不能重復(fù)。而如何實現(xiàn)有序存儲胖烛,就需要有一個比較器眼姐,其實說起來诅迷,TreeSet更受關(guān)注的是不重復(fù)且有序,這個有序就需要有一個compare的過程妥凳,因此會需要參數(shù)實現(xiàn)Comparable接口竟贯。
- 如果想徹底了解底層到底是如何思想那就需要看看我寫的Java之HashMap的底層原理:面試常考知識點了
- HashSet采记、LinkHashSet佣耐、TreeSet的迭代遍歷順序是怎樣的呢?
Java之HashSet的底層原理:面試常問考點
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門晌柬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥份,“玉大人,你說我怎么就攤上這事年碘〕呵福” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵屿衅,是天一觀的道長埃难。 經(jīng)常有香客問我,道長涤久,這世上最難降的妖魔是什么涡尘? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮响迂,結(jié)果婚禮上考抄,老公的妹妹穿的比我還像新娘。我一直安慰自己蔗彤,他們只是感情好川梅,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幕与,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镇防。 梳的紋絲不亂的頭發(fā)上啦鸣,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胃榕!你這毒婦竟也來了盛险?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布您朽,位于F島的核電站,受9級特大地震影響换淆,放射性物質(zhì)發(fā)生泄漏哗总。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一倍试、第九天 我趴在偏房一處隱蔽的房頂上張望讯屈。 院中可真熱鬧,春花似錦县习、人聲如沸涮母。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽叛本。三九已至,卻和暖如春彤钟,著一層夾襖步出監(jiān)牢的瞬間来候,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 搞懂 HashSet & LinkedHashSet 源碼 以及集合常見面試題目 經(jīng)過上兩篇的 HashMap 和...
- 原文地址 Java集合 Java集合框架:是一種工具類休蟹,就像是一個容器可以存儲任意數(shù)量的具有共同屬性的對象沸枯。 Ja...