Java 深入淺出掌握Collection單列集合Set
前言
Hello!上一期我大致講解了關(guān)于Collection單列集合以及它的子接口List集合的概述、特點和遍歷等,今天我為大家講解關(guān)于Collection集合的另一個子接口-->Set集合的相關(guān)知識點。

Set集合
Set概述
【1】Set集合類似于一個集裝箱,程序可以依次將這些貨物(多個對象)裝運進此集裝箱,而Set集合往往不能記住裝運這些貨物的順序(元素的添加順序),且不允許裝運相同的貨物。
【2】Set集合不允許包含相同的元素,如果試圖把兩個相同元素加入同一個Set集合中,則添加操作失敗,add()方法返回false,且新元素不會被加入。
Set特點
- 元素存取無序
- 沒有索引、只能通過迭代器或增強for循環(huán)遍歷
- 不能存儲重復(fù)元素
public class SetDemo_01 {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
//添加元素
set.add("Hello");
set.add("World");
set.add("Java");
set.add("Hello");//Set不包含重復(fù)元素的集合,(相同的,只輸出一個)
//Set沒有索引、只能通過迭代器或增強for循環(huán)遍歷且元素存取無序
//迭代器遍歷
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String s = it.next();
System.out.println(s);
}
//增強for
for (String s : set) {
System.out.println(s);
}
}
}
HashSet集合
HashSet概述
HashSet是Set接口的典型實現(xiàn),大多數(shù)時候使用Set集合時就是使用這個實現(xiàn)類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。底層數(shù)據(jù)結(jié)構(gòu)是哈希表。
哈希值:
哈希值簡介:是JDK根據(jù)對象的地址或者字符串或者數(shù)字算出來的int類型的數(shù)值
如何獲取哈希值:Object類中的public int hashCode():返回對象的哈希碼值
哈希值的特點:(1)同一個對象多次調(diào)用hashCode()方法返回的哈希值是相同的;(2)默認情況下,不同對象的哈希值是不同的。而重寫hashCode()方法,可以實現(xiàn)讓不同對象的哈希值相同
HashSet特點
- 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
- 對集合的迭代順序不作任何保證,也就是說不保證存儲和取出的元素順序一致
- 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
- 由于是Set集合,所以不包含重復(fù)元素的集合
public class HashSetDemo_01 {
public static void main(String[] args) {
//創(chuàng)建集合對象
HashSet<String> hs = new HashSet<>();
//添加元素
hs.add("Hello");
hs.add("World");
hs.add("Java");
hs.add("Java");//由于是Set集合,所以是不包含重復(fù)元素的集合.相同的元素,只輸出一個
//沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
//迭代器方式
Iterator<String> it = hs.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
System.out.println("----------------");
//增強for
for (String s : hs) {
System.out.println(s);
}
}
}
HashSet集合保證元素唯一性源碼分析
HashSet集合保證元素唯一性的原理:
- 根據(jù)對象的哈希值計算存儲位置( 1.如果當(dāng)前位置沒有元素則直接存入; 如果當(dāng)前位置有元素存在,則進入第二步)
- 當(dāng)前元素的元素和已經(jīng)存在的元素比較哈希值(1. 如果哈希值不同,則將當(dāng)前元素進行存儲; 如果哈希值相同,則進入第三步)
- 通過equals()方法比較兩個元素的內(nèi)容(1. 如果內(nèi)容不相同,則將當(dāng)前元素進行存儲;2.如果內(nèi)容相同,則不存儲當(dāng)前元素)
HashSet集合保證元素唯一性的圖解

LinkedHashSet集合
LinkedHashSet概述與特點
他是Set集合典型實現(xiàn)類HashSet的子類,繼承了set集合的所有功能和特點,同時把其中的重要特點給修改,把無序變?yōu)橛行颉?/p>
- 哈希表和鏈表實現(xiàn)的Set接口,具有可預(yù)測的迭代次序
- 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的
- 由哈希表保證元素唯一,也就是說沒有重復(fù)的元素
public class LinkedHashSetDemo {
public static void main(String[] args) {
//創(chuàng)建LinkedHashSet集合對象
LinkedHashSet<String> lhs = new LinkedHashSet<>();
lhs.add("Hello");
lhs.add("World");
lhs.add("Java");
//由哈希表保證元素唯一,也就是說沒有重復(fù)的元素
lhs.add("Java");
/*哈希表和鏈表實現(xiàn)的Set接口,具有可預(yù)測的迭代次序
由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的*/
//遍歷集合
for (String s : lhs) {
System.out.println(s);
}
}
}
TreeSet集合
TreeSet是SortedSet接口的實現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。
TreeSet特點
- 元素有序,可以按照一定的規(guī)則進行排序,具體排序方式取決于構(gòu)造方法
- 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
- 由于是Set集合,所以不包含重復(fù)元素的集合
TreeSet(排序方式)
TreeSet():根據(jù)其元素的自然排序進行排序。TreeSet會調(diào)用集合元素的compareTo(Objec obj)方法來比較元素之間的大小關(guān)系,然后將集合元素按升序排列,這就是自然排序。
TreeSet(Comparator comparator) :根據(jù)指定的比較器進行排序。
這里我給出視頻講解里的關(guān)于比較器排序Comparator的使用的案例:

- 學(xué)生類
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 測試類
public class TreeSetDemo {
public static void main(String[] args) {
//創(chuàng)建集合對象
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
//this.age - s.age
//s1,s2
int num = s1.getAge() - s2.getAge();
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});
//創(chuàng)建學(xué)生對象
Student s1 = new Student("xishi", 29);
Student s2 = new Student("wangzhaojun", 28);
Student s3 = new Student("diaochan", 30);
Student s4 = new Student("yangyuhuan", 33);
Student s5 = new Student("linqingxia",33);
Student s6 = new Student("linqingxia",33);
//把學(xué)生添加到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
//遍歷集合
for (Student s : ts) {
System.out.println(s.getName() + "," + s.getAge());
}
}
}
總結(jié)
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數(shù)組類似,List可以動態(tài)增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
【1】HashSet采用哈希表的存儲結(jié)構(gòu)所以里面的數(shù)據(jù)是無序但是唯一的。(實現(xiàn)唯一的方式就是重寫 Hashcode和equals方法)
【2】TreeSet支持兩種排序方法:自然排序和定制排序,TreeSet默認采用自然排序。
今日的有關(guān)Set集合內(nèi)容的分享就到這了,下期Map集合再會!(可以給個愛心嗎,友友們)

以上就是Java 深入淺出掌握Collection單列集合Set的詳細內(nèi)容,更多關(guān)于Java 單列集合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用dynamic datasource springboot starter實現(xiàn)多數(shù)據(jù)源及源碼分析
這篇文章主要介紹了使用dynamic-datasource-spring-boot-starter做多數(shù)據(jù)源及源碼分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
SpringBoot整合MyBatis四種常用的分頁方式(詳細總結(jié))
這篇文章詳細給大家總結(jié)了SpringBoot整合MyBatis四種常用的分頁方式,文中通過代碼示例為大家介紹的非常詳細,需要的朋友可以參考下2023-07-07
Java數(shù)據(jù)結(jié)構(gòu)之查找
本文主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中查找的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
Java Web監(jiān)聽器如何實現(xiàn)定時發(fā)送郵件
這篇文章主要介紹了Java Web監(jiān)聽器如何實現(xiàn)定時發(fā)送郵件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12
Spring?Boot獲取resources目錄下的文件三種方式詳解
在Spring?Boot項目中,經(jīng)常需要獲取resources目錄下的文件,這些文件可以包括配置文件、模板文件、靜態(tài)資源等,這篇文章主要介紹了Spring?Boot獲取resources目錄下的文件的三種方式,需要的朋友可以參考下2023-06-06
java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序詳解
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序,結(jié)合實例形式分析了希爾排序的概念、原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下2017-05-05

