更新時(shí)間:2020-05-25 16:01:49 來源:動力節(jié)點(diǎn) 瀏覽2395次
HashSet的底層實(shí)現(xiàn),因?yàn)镠ashSet底層是通過HashMap實(shí)現(xiàn)的。 所以HashSet底層也是通過哈希表的數(shù)據(jù)結(jié)構(gòu)存儲的。所以這里我們就不在介紹有關(guān)數(shù)據(jù)結(jié)構(gòu)方面的知識了,下面我們從HashSet的初始化方面著手,來分析一下HashSet的底層實(shí)現(xiàn)。
初始化
我們看到,在HashSet中的無參構(gòu)造方法中,直接創(chuàng)建了一個(gè)HashMap對象。這就證明了我們上述所說的,HashSet底層是通過HashMap實(shí)現(xiàn)的。我們在分析HashMap那篇文章中有提到過。如果我們使用無參的構(gòu)造方法來創(chuàng)建HashMap對象,那么此時(shí)底層的數(shù)據(jù)結(jié)構(gòu)不會初始化,第一次初始化發(fā)生在第一次調(diào)用put方法的時(shí)候。所以我們在這里可以說,當(dāng)我們調(diào)用無參構(gòu)造方法來創(chuàng)建HashSet對象時(shí),底層的數(shù)據(jù)結(jié)構(gòu)也不會執(zhí)行初始化。那么它第一次初始化的動作,也應(yīng)該發(fā)生在第一次調(diào)用添加元素的方法中,也就是HashSet中的add方法。下面我們看一下該方法的具體的邏輯。
上面代碼是HashSet中add方法,我們看到該方法的邏輯是直接調(diào)用了HashMap中的put方法,并將添加的元素的值設(shè)置為HashMap中的key,value存儲一個(gè)Object對象。
總結(jié)
分析到這里使我們知道HashSet有以下幾點(diǎn)特性,它們分別是:
在HashSet中是不能保證元素的添加順序與遍歷順序是一致的。因?yàn)榈讓邮峭ㄟ^HashMap中的key的值保存的。因?yàn)镠ashMap中的key的值是通過key的hash code計(jì)算出來的。所以不能保證添加順序與遍歷順序是一致的。
因?yàn)镠ashSet底層是通過HashMap中的key的值保存的,所以在HashSet中是不能保存重復(fù)元素的。因?yàn)樵贖ashMap中的key也是不能重復(fù)的。如果在HashMap中保存了重復(fù)的key,那么后添加到HashMap中的value會替換掉先添加到HashMap中的value。
因?yàn)镠ashMap不是線程安全的集合類,并且我們分析HashSet源碼時(shí),也沒有發(fā)現(xiàn)HashSet添加額外的同步關(guān)鍵字synchronized,所以說明HashSet也不是線程安全的集合類。
以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“Java編程入門, hashset實(shí)現(xiàn)之源碼解析”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743