溫馨提示×

溫馨提示×

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

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

如何進行HashSet的源碼解析

發(fā)布時間:2021-12-08 15:45:48 來源:億速云 閱讀:113 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細講解有關(guān)如何進行HashSet的源碼解析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

今天我們分析一下HashSet的底層實現(xiàn),因為HashSet底層是通過HashMap實現(xiàn)的。 所以HashSet底層也是通過哈希表的數(shù)據(jù)結(jié)構(gòu)存儲的。所以這里我們就不在介紹有關(guān)數(shù)據(jù)結(jié)構(gòu)方面的知識了,有不了解哈希表底層實現(xiàn)的可以去瀏覽HashMap這篇文章。下面我們將和其它集合一樣,從HashSet的初始化方面著手,來分析一下HashSet的底層實現(xiàn)。

  • 初始化

如何進行HashSet的源碼解析

我們看到,在HashSet中的無參構(gòu)造方法中,直接創(chuàng)建了一個HashMap對象。這就證明了我們上述所說的,HashSet底層是通過HashMap實現(xiàn)的。我們在分析HashMap那篇文章中有提到過。如果我們使用無參的構(gòu)造方法來創(chuàng)建HashMap對象,那么此時底層的數(shù)據(jù)結(jié)構(gòu)不會初始化,第一次初始化發(fā)生在第一次調(diào)用put方法的時候。所以我們在這里可以說,當我們調(diào)用無參構(gòu)造方法來創(chuàng)建HashSet對象時,底層的數(shù)據(jù)結(jié)構(gòu)也不會執(zhí)行初始化。那么它第一次初始化的動作,也應(yīng)該發(fā)生在第一次調(diào)用添加元素的方法中,也就是HashSet中的add方法。下面我們看一下該方法的具體的邏輯。

如何進行HashSet的源碼解析

上面代碼是HashSet中add方法,我們看到該方法的邏輯是直接調(diào)用了HashMap中的put方法,并將添加的元素的值設(shè)置為HashMap中的key,value存儲一個Object對象。

分析到這里使我們知道HashSet有以下幾點特性,它們分別是:

  • 在HashSet中是不能保證元素的添加順序與遍歷順序是一致的。因為底層是通過HashMap中的key的值保存的。因為HashMap中的key的值是通過key的hash code計算出來的。所以不能保證添加順序與遍歷順序是一致的。

  • 因為HashSet底層是通過HashMap中的key的值保存的,所以在HashSet中是不能保存重復(fù)元素的。因為在HashMap中的key也是不能重復(fù)的。如果在HashMap中保存了重復(fù)的key,那么后添加到HashMap中的value會替換掉先添加到HashMap中的value。

  • 因為HashMap不是線程安全的集合類,并且我們分析HashSet源碼時,也沒有發(fā)現(xiàn)HashSet添加額外的同步關(guān)鍵字synchronized,所以說明HashSet也不是線程安全的集合類。

關(guān)于如何進行HashSet的源碼解析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI