Java 深入淺出掌握Collection單列集合Set
前言
Hello!上一期我大致講解瞭關於Collection單列集合以及它的子接口List集合的概述、特點和遍歷等,今天我為大傢講解關於Collection集合的另一個子接口–>Set集合的相關知識點。
Set集合
Set概述
【1】Set集合類似於一個集裝箱,程序可以依次將這些貨物(多個對象)裝運進此集裝箱,而Set集合往往不能記住裝運這些貨物的順序(元素的添加順序),且不允許裝運相同的貨物。
【2】Set集合不允許包含相同的元素,如果試圖把兩個相同元素加入同一個Set集合中,則添加操作失敗,add()方法返回false,且新元素不會被加入。
Set特點
- 元素存取無序
- 沒有索引、隻能通過迭代器或增強for循環遍歷
- 不能存儲重復元素
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不包含重復元素的集合,(相同的,隻輸出一個) //Set沒有索引、隻能通過迭代器或增強for循環遍歷且元素存取無序 //迭代器遍歷 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接口的典型實現,大多數時候使用Set集合時就是使用這個實現類。HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。底層數據結構是哈希表。
哈希值:
哈希值簡介:是JDK根據對象的地址或者字符串或者數字算出來的int類型的數值
如何獲取哈希值:Object類中的public int hashCode():返回對象的哈希碼值
哈希值的特點:(1)同一個對象多次調用hashCode()方法返回的哈希值是相同的;(2)默認情況下,不同對象的哈希值是不同的。而重寫hashCode()方法,可以實現讓不同對象的哈希值相同
HashSet特點
- 底層數據結構是哈希表
- 對集合的迭代順序不作任何保證,也就是說不保證存儲和取出的元素順序一致
- 沒有帶索引的方法,所以不能使用普通for循環遍歷
- 由於是Set集合,所以不包含重復元素的集合
public class HashSetDemo_01 { public static void main(String[] args) { //創建集合對象 HashSet<String> hs = new HashSet<>(); //添加元素 hs.add("Hello"); hs.add("World"); hs.add("Java"); hs.add("Java");//由於是Set集合,所以是不包含重復元素的集合.相同的元素,隻輸出一個 //沒有帶索引的方法,所以不能使用普通for循環遍歷 //迭代器方式 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集合保證元素唯一性的原理:
- 根據對象的哈希值計算存儲位置( 1.如果當前位置沒有元素則直接存入; 如果當前位置有元素存在,則進入第二步)
- 當前元素的元素和已經存在的元素比較哈希值(1. 如果哈希值不同,則將當前元素進行存儲; 如果哈希值相同,則進入第三步)
- 通過equals()方法比較兩個元素的內容(1. 如果內容不相同,則將當前元素進行存儲;2.如果內容相同,則不存儲當前元素)
HashSet集合保證元素唯一性的圖解
LinkedHashSet集合
LinkedHashSet概述與特點
他是Set集合典型實現類HashSet的子類,繼承瞭set集合的所有功能和特點,同時把其中的重要特點給修改,把無序變為有序。
- 哈希表和鏈表實現的Set接口,具有可預測的迭代次序
- 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的
- 由哈希表保證元素唯一,也就是說沒有重復的元素
public class LinkedHashSetDemo { public static void main(String[] args) { //創建LinkedHashSet集合對象 LinkedHashSet<String> lhs = new LinkedHashSet<>(); lhs.add("Hello"); lhs.add("World"); lhs.add("Java"); //由哈希表保證元素唯一,也就是說沒有重復的元素 lhs.add("Java"); /*哈希表和鏈表實現的Set接口,具有可預測的迭代次序 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的*/ //遍歷集合 for (String s : lhs) { System.out.println(s); } } }
TreeSet集合
TreeSet是SortedSet接口的實現類,TreeSet可以確保集合元素處於排序狀態。
TreeSet特點
- 元素有序,可以按照一定的規則進行排序,具體排序方式取決於構造方法
- 沒有帶索引的方法,所以不能使用普通for循環遍歷
- 由於是Set集合,所以不包含重復元素的集合
TreeSet(排序方式)
TreeSet():根據其元素的自然排序進行排序。TreeSet會調用集合元素的compareTo(Objec obj)方法來比較元素之間的大小關系,然後將集合元素按升序排列,這就是自然排序。
TreeSet(Comparator comparator) :根據指定的比較器進行排序。
這裡我給出視頻講解裡的關於比較器排序Comparator的使用的案例:
- 學生類
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) { //創建集合對象 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; } }); //創建學生對象 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); //把學生添加到集合 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()); } } }
總結
Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
【1】HashSet采用哈希表的存儲結構所以裡面的數據是無序但是唯一的。(實現唯一的方式就是重寫 Hashcode和equals方法)
【2】TreeSet支持兩種排序方法:自然排序和定制排序,TreeSet默認采用自然排序。
今日的有關Set集合內容的分享就到這瞭,下期Map集合再會!(可以給個愛心嗎,友友們)
以上就是Java 深入淺出掌握Collection單列集合Set的詳細內容,更多關於Java 單列集合的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Java集合類之TreeSet的用法詳解
- 一文掌握Java中List和Set接口的基本使用
- Java十分鐘精通集合的使用與原理下篇
- 深入淺出講解Java集合之Collection接口
- 帶你入門Java的集合