Java如何使用Set接口存儲(chǔ)沒(méi)有重復(fù)元素的數(shù)組
Set接口
Set接口和List接口一樣,繼承Collection接口,Set接口中元素?zé)o序,并且都會(huì)以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)。
HashSet集合
HashSet是Set接口的一個(gè)實(shí)現(xiàn)類,所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無(wú)序的,當(dāng)向HashSet集合中添加一個(gè)對(duì)象時(shí),首先會(huì)調(diào)用該對(duì)象的hashCode()方法來(lái)計(jì)算對(duì)象的哈希值,從而確定元素的存儲(chǔ)位置。如果此時(shí)哈希值相同,再調(diào)用對(duì)象的equals()方法來(lái)確保該位置沒(méi)有重復(fù)元素。
package 集合類; import java.util.HashSet; import java.util.Iterator; public class Set { public static void main(String[] args) { HashSet set=new HashSet(); set.add("hello"); set.add("world"); set.add("abc"); set.add("hello"); Iterator it=set.iterator(); while(it.hasNext()){ Object obj=it.next(); System.out.print(obj+ " "); } } }
運(yùn)行結(jié)果
由運(yùn)行結(jié)果可以看出,取出元素的順序和添加元素的順序并不一致,并且重復(fù)的字符串被去掉了,只添加了一次,是因?yàn)镠ashSet集合的add()方法存入元素時(shí),首先調(diào)用當(dāng)前存入對(duì)象的hashCode()方法獲得對(duì)象的哈希值,然后根據(jù)哈希值算出一個(gè)存儲(chǔ)位置,如果這個(gè)位置上沒(méi)有元素,則直接將該元素存入,如果該位置上有元素存在,則會(huì)調(diào)用equal()方法讓當(dāng)前存入的元素依次和該位置上的元素比較。如果返回結(jié)果為false就將該元素存入集合,返回結(jié)果為true,則說(shuō)明有重復(fù)元素,將該元素舍棄。
package 集合類; import java.util.HashSet; class Student{ String id; String name; public Student(String id,String name){ this.id=id; this.name=name; } public String toString(){ String s = id + ":" + name; return s; } } public class Set1 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }
運(yùn)行結(jié)果
所沒(méi)有去掉重復(fù)的元素,是因?yàn)樵诙xStudent類時(shí)沒(méi)有重寫hashCode()和equals()方法。
package API; import java.util.HashSet; class Student{ private String id; private String name; public Student(String id,String name){ this.id=id; this.name=name; } //重寫toString方法 public String toString(){ return id+ ":"+name; } //重寫hashCode方法 public int hashCode(){ //返回id屬性的哈希值 return id.hashCode(); } public boolean equals(Object obj){ //判斷是否是同一個(gè)對(duì)象 if(this==obj){ return true; } //判斷對(duì)象是Student類型 if(!(obj instanceof Student)){ return false; } //將對(duì)象強(qiáng)轉(zhuǎn)為Student類型 Student stu=(Student) obj; //判斷id是否相同 boolean b=this.id.equals(stu.id); return b; } } public class Set2 { public static void main(String[] args) { HashSet hs=new HashSet(); Student stu1=new Student("1","hello"); Student stu2=new Student("2","world"); Student stu3=new Student("1","hello"); hs.add(stu1); hs.add(stu2); hs.add(stu3); System.out.println(hs); } }
運(yùn)行結(jié)果
由于Student類重寫了Object類的hashCode()和equals()方法。在hashCode()方法中返回id屬性的哈希值,在equals()方法中比較對(duì)象的id屬性是否相等,并返回結(jié)果。當(dāng)調(diào)用HashSet集合的add()方法添加stu3對(duì)象時(shí),發(fā)現(xiàn)它的哈希值與stu2對(duì)象相同,而且stu2.equals(stu3)返回true。HashSet認(rèn)定兩個(gè)對(duì)象相同,因此重復(fù)的Student對(duì)象被去除了。
到此這篇關(guān)于Java如何使用Set接口存儲(chǔ)沒(méi)有重復(fù)元素的數(shù)組的文章就介紹到這了,更多相關(guān)Java Set接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)擲骰子控制臺(tái)和窗體兩種方法
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)擲骰子控制臺(tái)和窗體兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08SpringBoot中shiro過(guò)濾器的重寫與配置詳解
在前后端分離跨域訪問(wèn)的項(xiàng)目中shiro進(jìn)行權(quán)限攔截失效 (即使有正確權(quán)限的訪問(wèn)也會(huì)被攔截) 時(shí)造成302重定向錯(cuò)誤等問(wèn)題,為解決這個(gè)問(wèn)題,就需要進(jìn)行shiro過(guò)濾器的重寫以及配置。本文詳細(xì)介紹了解決方法,需要的可以參考一下2022-04-04Spring MVC利用Swagger2如何構(gòu)建動(dòng)態(tài)RESTful API詳解
這篇文章主要給大家介紹了關(guān)于在Spring MVC中利用Swagger2如何構(gòu)建動(dòng)態(tài)RESTful API的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10Java用freemarker導(dǎo)出word實(shí)用示例
本篇文章主要介紹了Java用freemarker導(dǎo)出word實(shí)用示例,使用freemarker的模板來(lái)實(shí)現(xiàn)功能,有需要的可以了解一下。2016-11-11對(duì)arraylist中元素進(jìn)行排序?qū)嵗a
這篇文章主要介紹了對(duì)arraylist中元素進(jìn)行排序?qū)嵗a,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11java對(duì)接webservice接口的4種方式總結(jié)
因工作需要和一個(gè)Sap相關(guān)系統(tǒng)以WebService的方式進(jìn)行接口聯(lián)調(diào),之前僅聽過(guò)這種技術(shù),但并沒(méi)有實(shí)操過(guò),所以將本次開發(fā)進(jìn)行記錄,這篇文章主要給大家介紹了關(guān)于java對(duì)接webservice接口的4種方式,需要的朋友可以參考下2023-10-10