這篇文章主要介紹“HashSet中怎么重寫(xiě)haseCode和equals”,在日常操作中,相信很多人在HashSet中怎么重寫(xiě)haseCode和equals問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”HashSet中怎么重寫(xiě)haseCode和equals”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到安徽網(wǎng)站設(shè)計(jì)與安徽網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋安徽地區(qū)。為了保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)系的數(shù)據(jù),Java提供了集合類
集合中的Set,類似一個(gè)大罐子,可以依次把1至多個(gè)對(duì)象存入Set集合,Set集合通常無(wú)法記住元素的添加順序
而Set集合中不允許包含兩個(gè)相同的元素加入同一個(gè)Set集合中,在多個(gè)線程同時(shí)訪問(wèn)同一個(gè)HashSet時(shí),多個(gè)線程同時(shí)修改HashSet集合時(shí),則必須通過(guò)代碼來(lái)保證其同步
那么HashSet是怎么樣區(qū)分不同元素的?這就要說(shuō)到了hashCode和equals
在HashSet集合加了一個(gè)元素時(shí),HashSet會(huì)調(diào)用該對(duì)象的hashCode方法來(lái)得到該對(duì)象的hashCode值,然后根據(jù)hashCode值決定該對(duì)象在HashSet中的位置,如果兩個(gè)元素通過(guò)equals方法比較返回true,但他們的hashCode方法返回值不相等,HashSet將會(huì)把他們存放在不同的位置,依然可以添加成功
也就是說(shuō)HashSet辨別元素是否相同是通過(guò)equals判斷相等加上對(duì)比hashCode值
下面看一段代碼
class h { public boolean equals( object obj) { return true; } } class z { public int hashCode() { return 1; } } class t { public int hashCode() { return 2; } public boolean equals( object obj) { return true; } } public class HashSetTest { public static void main(String[] args) { var b=new HashSet(); b.add(new h); b.add(new h); b.add(new z); b.add(new z); b.add(new t); b.add(new t); System.out.println(b); } }
結(jié)果是:
h@5674dd,h@0987as,z@1,z@1,t@2
也就是說(shuō),
兩個(gè)h對(duì)象通過(guò)equals方法比較返回true,但HashSet依然把他們當(dāng)做兩個(gè)對(duì)象
兩個(gè)z對(duì)象通過(guò)hashCode返回相同值,但HashSet依然把他們當(dāng)做兩個(gè)對(duì)象
兩個(gè)t對(duì)象通過(guò)equals方法比較返回true,通過(guò)hashCode返回相同值,此時(shí),HashSet才將他們當(dāng)為一個(gè)對(duì)象
可見(jiàn):當(dāng)把一個(gè)對(duì)象放入HashSet中如果重寫(xiě)equals就應(yīng)該重寫(xiě)hashCode
當(dāng)equals對(duì)比兩個(gè)對(duì)象相等時(shí),如果hashCode不同,則會(huì)將兩個(gè)相同的元素添加入HashSet,這就和Set集合的規(guī)則沖突了
此時(shí),還有一種極端情況:如果hashCode相等,而equals不同,會(huì)怎么樣呢?
那么,將會(huì)更麻煩,HashSet試圖將他們放在一起,但是又不行
所以,將會(huì)采用鏈?zhǔn)浇Y(jié)構(gòu),保存多個(gè)對(duì)象,進(jìn)而影響性能,導(dǎo)致性能下降
到此,關(guān)于“HashSet中怎么重寫(xiě)haseCode和equals”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!