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