溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java面試中如何從源碼角度分析HashSet實(shí)現(xiàn)原理

發(fā)布時(shí)間:2021-10-13 11:25:10 來源:億速云 閱讀:109 作者:柒染 欄目:編程語言

這篇文章給大家介紹Java面試中如何從源碼角度分析HashSet實(shí)現(xiàn)原理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

面試官:請問HashSet有哪些特點(diǎn)?

應(yīng)聘者:HashSet實(shí)現(xiàn)自set接口,set集合中元素?zé)o序且不能重復(fù);

面試官:那么HashSet 如何保證元素不重復(fù)?

應(yīng)聘者:因?yàn)镠ashSet底層是基于HashMap實(shí)現(xiàn)的,當(dāng)你new一個(gè)HashSet時(shí)候,實(shí)際上是new了一個(gè)map,執(zhí)行add方法時(shí),實(shí)際上調(diào)用map的put方法,value始終是PRESENT,所以根據(jù)HashMap的一個(gè)特性: 將一個(gè)key-value對放入HashMap中時(shí),首先根據(jù)key的hashCode()返回值決定該Entry的存儲位置,如果兩個(gè)key的hash值相同,那么它們的存儲位置相同。

如果這個(gè)兩個(gè)key的equalus比較返回true。那么新添加的Entry的value會覆蓋原來的Entry的value,key不會覆蓋。因此,如果向HashSet中添加一個(gè)已經(jīng)存在的元素,新添加的集合元素不會覆蓋原來已有的集合元素;

源碼分析

先來看一下無參的構(gòu)造函數(shù):

public HashSet() {  map = new HashMap<>();}

很顯然,當(dāng)你new一個(gè)HashSet的時(shí)候,實(shí)際上是new了一個(gè)HashMap

再來看一下add方法:

private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null;}

定義一個(gè)虛擬的Object PRESENT是向map中插入key-value對應(yīng)的value,因?yàn)镠ashSet中只需要用到key,而HashMap是key-value鍵值對;所以,向map中添加鍵值對時(shí),鍵值對的值固定是PRESENT。

源碼中HashSet的絕大部分方法都是通過調(diào)用HashMap的方法來實(shí)現(xiàn)的,其他的方法,就請大家自己查閱一下源碼吧。

關(guān)于Java面試中如何從源碼角度分析HashSet實(shí)現(xiàn)原理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI