2022-12-15
元素 hashset student 集合
Set接口簡介
Set接口和List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對Collection接口進行功能上的擴充,只是比Collection接口更加嚴(yán)格了。與List接口不同的是,Set接口中元素?zé)o序,并且都會以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)。
Set接口主要有兩個實現(xiàn)類,分別是HashSet和TreeSet。其中,HashSet是根據(jù)對象的哈希值來確定元素在集合中的存儲位置,具有良好的存取和查找性能。TreeSet則是以二叉樹的方式來存儲元素,它可以實現(xiàn)對集合中的元素進行排序。
HashSet集合
HashSet是Set接口的一個實現(xiàn)類,它所存儲的元素是不可重復(fù)的,并且元素都是無序的。接下來通過一個案例演示HashSet集合的用法。
Java |
從打印結(jié)果可以看出,取出元素的順序與添加元素的順序并不一致,并且重復(fù)存入的字符串對象“李四”被去除了,只添加了一次。
HashSet集合之所以能確保不出現(xiàn)重復(fù)的元素,是因為它在存入元素時做了很多工作。當(dāng)調(diào)用HashSet集合的add()方法存入元素時,首先調(diào)用當(dāng)前存入對象的hashCode()方法獲得對象的哈希值,然后根據(jù)對象的哈希值計算出一個存儲位置。如果該位置上沒有元素,則直接將元素存入,如果該位置上有元素存在,則會調(diào)用equals()方法讓當(dāng)前存入的元素依次和該位置上的元素進行比較,如果返回的結(jié)果為false就將該元素存入集合,返回的結(jié)果為true則說明有重復(fù)元素,就將該元素舍棄。HashSet存儲元素的流程如下圖所示。
根據(jù)前面的分析不難看出,當(dāng)向集合中存入元素時,為了保證HashSet正常工作,要求在存入對象時,重寫Object類中的hashCode()和equals()方法。在上述案例中將字符串存入HashSet時,String類已經(jīng)重寫了Object類中的hashCode()和equals()方法。但是如果將自定義的Student對象存入HashSet,結(jié)果又如何呢?
接下來通過一個案例演示向HashSet存儲字符串。
Java |
在上述代碼的運行結(jié)果中,出現(xiàn)了兩個相同的學(xué)生信息“2:李四”,這樣的學(xué)生信息應(yīng)該被視為重復(fù)元素,不允許同時出現(xiàn)在HashSet集合中。之所以沒有去掉這樣的重復(fù)元素,是因為在定義Student類時沒有重寫hashCode()和equals()方法。
接下來對Student類進行改寫,假設(shè)id相同的學(xué)生就是同一個學(xué)生,改寫后代碼見下。
Java |
在上述代碼中,Student類重寫了Object類的hashCode()和equals()方法。在hashCode()方法中返回id屬性的哈希值,在equals()方法中比較對象的id屬性是否相等,并返回結(jié)果。當(dāng)調(diào)用HashSet集合的add()方法添加stu3對象時,發(fā)現(xiàn)它的哈希值與stu2對象相同,而且id.equals(student.id)返回true,HashSet集合認為兩個對象相同,因此重復(fù)的Student對象被成功去除了。
HashSet集合存儲的元素是無序的,如果想讓元素的存取順序一致,可以使用Java中提供的LinkedHashSet類,LinkedHashSet類是HashSet的子類,與LinkedList一樣,它也使用雙向鏈表來維護內(nèi)部元素的關(guān)系。
接下來通過一個案例學(xué)習(xí)LinkedHashSet類的用法。
Java |
通過運行結(jié)果可以看出,元素迭代出來的順序和存入的順序是一致的。
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2019-07-22(北京)
開班盛況Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號