2022-12-15
元素 hashset student 集合
Set接口簡(jiǎn)介
Set接口和List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒(méi)有對(duì)Collection接口進(jìn)行功能上的擴(kuò)充,只是比Collection接口更加嚴(yán)格了。與List接口不同的是,Set接口中元素?zé)o序,并且都會(huì)以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)。
Set接口主要有兩個(gè)實(shí)現(xiàn)類,分別是HashSet和TreeSet。其中,HashSet是根據(jù)對(duì)象的哈希值來(lái)確定元素在集合中的存儲(chǔ)位置,具有良好的存取和查找性能。TreeSet則是以二叉樹(shù)的方式來(lái)存儲(chǔ)元素,它可以實(shí)現(xiàn)對(duì)集合中的元素進(jìn)行排序。
HashSet集合
HashSet是Set接口的一個(gè)實(shí)現(xiàn)類,它所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無(wú)序的。接下來(lái)通過(guò)一個(gè)案例演示HashSet集合的用法。
|
Java |
從打印結(jié)果可以看出,取出元素的順序與添加元素的順序并不一致,并且重復(fù)存入的字符串對(duì)象“李四”被去除了,只添加了一次。
HashSet集合之所以能確保不出現(xiàn)重復(fù)的元素,是因?yàn)樗诖嫒朐貢r(shí)做了很多工作。當(dāng)調(diào)用HashSet集合的add()方法存入元素時(shí),首先調(diào)用當(dāng)前存入對(duì)象的hashCode()方法獲得對(duì)象的哈希值,然后根據(jù)對(duì)象的哈希值計(jì)算出一個(gè)存儲(chǔ)位置。如果該位置上沒(méi)有元素,則直接將元素存入,如果該位置上有元素存在,則會(huì)調(diào)用equals()方法讓當(dāng)前存入的元素依次和該位置上的元素進(jìn)行比較,如果返回的結(jié)果為false就將該元素存入集合,返回的結(jié)果為true則說(shuō)明有重復(fù)元素,就將該元素舍棄。HashSet存儲(chǔ)元素的流程如下圖所示。

根據(jù)前面的分析不難看出,當(dāng)向集合中存入元素時(shí),為了保證HashSet正常工作,要求在存入對(duì)象時(shí),重寫(xiě)Object類中的hashCode()和equals()方法。在上述案例中將字符串存入HashSet時(shí),String類已經(jīng)重寫(xiě)了Object類中的hashCode()和equals()方法。但是如果將自定義的Student對(duì)象存入HashSet,結(jié)果又如何呢?
接下來(lái)通過(guò)一個(gè)案例演示向HashSet存儲(chǔ)字符串。
|
Java |
在上述代碼的運(yùn)行結(jié)果中,出現(xiàn)了兩個(gè)相同的學(xué)生信息“2:李四”,這樣的學(xué)生信息應(yīng)該被視為重復(fù)元素,不允許同時(shí)出現(xiàn)在HashSet集合中。之所以沒(méi)有去掉這樣的重復(fù)元素,是因?yàn)樵诙xStudent類時(shí)沒(méi)有重寫(xiě)hashCode()和equals()方法。
接下來(lái)對(duì)Student類進(jìn)行改寫(xiě),假設(shè)id相同的學(xué)生就是同一個(gè)學(xué)生,改寫(xiě)后代碼見(jiàn)下。
|
Java |
在上述代碼中,Student類重寫(xiě)了Object類的hashCode()和equals()方法。在hashCode()方法中返回id屬性的哈希值,在equals()方法中比較對(duì)象的id屬性是否相等,并返回結(jié)果。當(dāng)調(diào)用HashSet集合的add()方法添加stu3對(duì)象時(shí),發(fā)現(xiàn)它的哈希值與stu2對(duì)象相同,而且id.equals(student.id)返回true,HashSet集合認(rèn)為兩個(gè)對(duì)象相同,因此重復(fù)的Student對(duì)象被成功去除了。
HashSet集合存儲(chǔ)的元素是無(wú)序的,如果想讓元素的存取順序一致,可以使用Java中提供的LinkedHashSet類,LinkedHashSet類是HashSet的子類,與LinkedList一樣,它也使用雙向鏈表來(lái)維護(hù)內(nèi)部元素的關(guān)系。
接下來(lái)通過(guò)一個(gè)案例學(xué)習(xí)LinkedHashSet類的用法。
|
Java |
通過(guò)運(yùn)行結(jié)果可以看出,元素迭代出來(lái)的順序和存入的順序是一致的。
開(kāi)班時(shí)間:2021-04-12(深圳)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-17(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-03-22(杭州)
開(kāi)班盛況開(kāi)班時(shí)間:2021-04-26(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-05-10(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-02-22(北京)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2020-09-21(上海)
開(kāi)班盛況開(kāi)班時(shí)間:2021-07-12(北京)
預(yù)約報(bào)名開(kāi)班時(shí)間:2019-07-22(北京)
開(kāi)班盛況
Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right
京ICP備12003911號(hào)-5
京公網(wǎng)安備 11010802035720號(hào)