Java中的Set集合簡單匯總解析
Set接口簡介
Set接口和List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對Collection接口進(jìn)行功能上的擴(kuò)充,它是比Collection接口更加嚴(yán)格了。與List接口不同的是,Set接口元素?zé)o序,并且都會以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)。
Set接口主要有兩個實(shí)現(xiàn)類,分別是HashSet和TreeSet。其中,HashSet根據(jù)對象的哈希值來確定元素在集合中的存儲位置,因此具有良好的存取和查找性能。TreeSet則是以二叉樹的方式來存儲元素,它可以實(shí)現(xiàn)對集合中的元素進(jìn)行排序
HashSet集合
HashSet是Set接口的一個實(shí)現(xiàn)類,它所存儲的元素是不可重復(fù)的,并且元素都是無序的。當(dāng)向HashSet集合中添加一個對象時,首先會調(diào)用該對象的hashCode()方法來計(jì)算對象的哈希值,從而確定元素的存儲位置。如果此哈希值相同,再調(diào)用對象的equals()方法來確保該位置沒有重復(fù)元素。Set集合與List集合存取元素的方式都一樣。
通過一個案例來演示HashSet集合的用法:
public class Example01 { public static void main(String[] args) { HashSet set = new HashSet(); set.add("老大"); set.add("老二"); set.add("老三"); set.add("老二"); Iterator it = set.iterator(); while(it.hasNext()) { Object obj = it.next(); System.out.println(obj); } } }
結(jié) 論:
當(dāng)向集合中存入元素時,為了保證HashSet正常工作,要求在存入對象時,重寫Object類中的hashCode和equals()方法。
上述案例將字符串存入HashSet時,String類已經(jīng)重寫了hashCode()和equals()方法。但是如果將Student對象存入HashSet,結(jié)果又會怎樣呢?
class Student{ String id; String name; public Student(String id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return id+":"+name; } @Override public int hashCode() { return id.hashCode(); //返回id屬性的哈希值 } @Override public boolean equals(Object obj) { if(this == obj) { //判斷是否是同一個對象 return true; //如果是,直接返回true } if(!(obj instanceof Student)) { //判斷對象是為Student類型 return false; //如果對象不是Student類型返回false } Student stu = (Student) obj; //將對象強(qiáng)轉(zhuǎn)為Student類型 boolean b = this.id.equals(stu.id); //判斷id值是否相同 return b; //返回判斷結(jié)果 } } public class Example02 { public static void main(String[] args) { HashSet set = new HashSet(); set.add(new Student("1", "老王")); set.add(new Student("2", "老三")); set.add(new Student("2", "老三")); System.out.println(set); } }
Student類重寫了Object類的hashCode()和equals()方法。在hashCoded()方法中返回id屬性的哈希值,在equals()方法中比較對象的id屬性是否相等,并返回結(jié)果。當(dāng)調(diào)用HashSet集合的add()方法添加stu3對象時,發(fā)現(xiàn)它的哈希值與stu2對象相同,而且stu2.equals(stu3)返回true。HashSet集合認(rèn)為兩個對象相同,因此重復(fù)的Student對象對成功去除了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud之Feign、ribbon如何設(shè)置超時時間和重試機(jī)制
這篇文章主要介紹了springcloud之Feign、ribbon如何設(shè)置超時時間和重試機(jī)制,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java實(shí)現(xiàn)短信驗(yàn)證碼的示例代碼
Java是一種流行的編程語言,驗(yàn)證碼是一種常用的網(wǎng)絡(luò)安全技術(shù)。Java發(fā)展至今,網(wǎng)上也出現(xiàn)了各種各樣的驗(yàn)證碼,下面是用Java實(shí)現(xiàn)短信驗(yàn)證碼的總結(jié),感興趣的可以了解一下2023-03-03基于springmvc之常用注解,操作傳入?yún)?shù)
這篇文章主要介紹了springmvc之常用注解,操作傳入?yún)?shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java線程間協(xié)作wait、notify和notifyAll詳解
這篇文章主要介紹了Java線程間協(xié)作wait、notify和notifyAll詳解,在 Java 中可以用 wait、notify 和 notifyAll 來實(shí)現(xiàn)線程間的通信,盡管關(guān)于wait和notify的概念很基礎(chǔ),它們也都是Object類的函數(shù),但用它們來寫代碼卻并不簡單,,需要的朋友可以參考下2023-10-10