Java中的Set集合簡(jiǎn)單匯總解析
Set接口簡(jiǎn)介
Set接口和List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒有對(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ì)象的哈希值來確定元素在集合中的存儲(chǔ)位置,因此具有良好的存取和查找性能。TreeSet則是以二叉樹的方式來存儲(chǔ)元素,它可以實(shí)現(xiàn)對(duì)集合中的元素進(jìn)行排序
HashSet集合
HashSet是Set接口的一個(gè)實(shí)現(xiàn)類,它所存儲(chǔ)的元素是不可重復(fù)的,并且元素都是無序的。當(dāng)向HashSet集合中添加一個(gè)對(duì)象時(shí),首先會(huì)調(diào)用該對(duì)象的hashCode()方法來計(jì)算對(duì)象的哈希值,從而確定元素的存儲(chǔ)位置。如果此哈希值相同,再調(diào)用對(duì)象的equals()方法來確保該位置沒有重復(fù)元素。Set集合與List集合存取元素的方式都一樣。
通過一個(gè)案例來演示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)向集合中存入元素時(shí),為了保證HashSet正常工作,要求在存入對(duì)象時(shí),重寫Object類中的hashCode和equals()方法。
上述案例將字符串存入HashSet時(shí),String類已經(jīng)重寫了hashCode()和equals()方法。但是如果將Student對(duì)象存入HashSet,結(jié)果又會(huì)怎樣呢?
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) { //判斷是否是同一個(gè)對(duì)象
return true; //如果是,直接返回true
}
if(!(obj instanceof Student)) { //判斷對(duì)象是為Student類型
return false; //如果對(duì)象不是Student類型返回false
}
Student stu = (Student) obj; //將對(duì)象強(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()方法中比較對(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ì)象對(duì)成功去除了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程中ReentrantLock與Condition詳解
這篇文章主要介紹了Java多線程中ReentrantLock與Condition詳解,需要的朋友可以參考下2017-11-11
java swing實(shí)現(xiàn)QQ賬號(hào)密碼輸入框
這篇文章主要為大家詳細(xì)介紹了Java swing實(shí)現(xiàn)QQ賬號(hào)密碼輸入框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
一文講透為什么遍歷LinkedList要用增強(qiáng)型for循環(huán)
這篇文章主要為大家介紹了為什么遍歷LinkedList要用增強(qiáng)型for循環(huán)的透徹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Springboot整合Mybatis和SQLite的詳細(xì)過程
這篇文章主要介紹了Springboot整合Mybatis和SQLite的詳細(xì)過程,本文通過圖文示例相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07

