Java如何使用Set接口存儲沒有重復元素的數(shù)組
Set接口
Set接口和List接口一樣,繼承Collection接口,Set接口中元素無序,并且都會以某種規(guī)則保證存入的元素不出現(xiàn)重復。
HashSet集合
HashSet是Set接口的一個實現(xiàn)類,所存儲的元素是不可重復的,并且元素都是無序的,當向HashSet集合中添加一個對象時,首先會調(diào)用該對象的hashCode()方法來計算對象的哈希值,從而確定元素的存儲位置。如果此時哈希值相同,再調(diào)用對象的equals()方法來確保該位置沒有重復元素。
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+ " ");
}
}
}運行結(jié)果

由運行結(jié)果可以看出,取出元素的順序和添加元素的順序并不一致,并且重復的字符串被去掉了,只添加了一次,是因為HashSet集合的add()方法存入元素時,首先調(diào)用當前存入對象的hashCode()方法獲得對象的哈希值,然后根據(jù)哈希值算出一個存儲位置,如果這個位置上沒有元素,則直接將該元素存入,如果該位置上有元素存在,則會調(diào)用equal()方法讓當前存入的元素依次和該位置上的元素比較。如果返回結(jié)果為false就將該元素存入集合,返回結(jié)果為true,則說明有重復元素,將該元素舍棄。
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);
}
}運行結(jié)果
所沒有去掉重復的元素,是因為在定義Student類時沒有重寫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){
//判斷是否是同一個對象
if(this==obj){
return true;
}
//判斷對象是Student類型
if(!(obj instanceof Student)){
return false;
}
//將對象強轉(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);
}
}運行結(jié)果
由于Student類重寫了Object類的hashCode()和equals()方法。在hashCode()方法中返回id屬性的哈希值,在equals()方法中比較對象的id屬性是否相等,并返回結(jié)果。當調(diào)用HashSet集合的add()方法添加stu3對象時,發(fā)現(xiàn)它的哈希值與stu2對象相同,而且stu2.equals(stu3)返回true。HashSet認定兩個對象相同,因此重復的Student對象被去除了。

到此這篇關(guān)于Java如何使用Set接口存儲沒有重復元素的數(shù)組的文章就介紹到這了,更多相關(guān)Java Set接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringSecurity中@PermitAll與@PreAuthorize的實現(xiàn)
@PermitAll和@PreAuthorize都是處理安全性的強大工具,本文主要介紹了SpringSecurity中@PermitAll與@PreAuthorize的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-07-07
詳解Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat
這篇文章主要介紹了Java時區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat的區(qū)別于用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
windows定時器配置執(zhí)行java jar文件的方法詳解
這篇文章主要給大家介紹了關(guān)于windows定時器配置執(zhí)行java jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
這篇文章給大家總結(jié)了SpringBoot讀取 jar 包中的 resources 目錄下的文件的三種方式,文中有詳細的代碼示例供大家參考,,需要的朋友可以參考下2023-06-06
基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗的實現(xiàn)方式
這篇文章主要介紹了基于SpringBoot服務(wù)端表單數(shù)據(jù)校驗的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
java設(shè)計模式之實現(xiàn)對象池模式示例分享
對象池模式經(jīng)常用在頻繁創(chuàng)建、銷毀對象(并且對象創(chuàng)建、銷毀開銷很大)的場景,比如數(shù)據(jù)庫連接池、線程池、任務(wù)隊列池等。本代碼簡單,沒有限制對象池大小2014-02-02

