日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet

發布時間:2023/12/2 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • Set接口概述
    • HashSet實現類
    • LinkedHashSet實現類
    • TreeSet實現類



Set接口概述

1、Set接口是Collection的子接口,set接口沒有定義額外的方法,使用的都是Collection接口中的方法。
2、Set 集合不允許包含相同的元素,如果試把兩個相同的元素加入同一個Set 集合中,則添加操作失敗。


3、Set:存儲無序的、不可重復的數據
(以HashSet為例說明)
①無序性:不等于隨機性。存儲的數據在底層數組中并非按照數組索引的順序添加,而是根據數據的哈希值。
②不可重復性:保證添加的元素按照equals()判斷時,不能返回true。即:相同的元素只能添加一個。



HashSet實現類

1、HashSet 具有以下特點:
①不能保證元素的排列順序
②HashSet 不是線程安全的
③集合元素可以是 null

2、HashSet 集合判斷兩個元素相等的標準:兩個對象通過 hashCode() 方法比較相等,并且兩個對象的 equals() 方法返回值也相等。因此對于存放在Set容器中的對象,對應的類一定要重寫equals()和hashCode()方法,以實現對象相等規則,即:“相等的對象必須具有相等的散列碼”。

3、向HashSet中添加元素的過程:
我們向HashSet中添加元素a,首先調用元素a所在類的hashCode()方法,計算元素a的哈希值,此哈希值接著通過某種算法計算出在HashSet底層數組中的存放位置(索引位置)。接著判斷數組此位置上是否已經有元素:

如果此位置上沒有其他元素,則元素a添加成功。—>情況1
如果此位置上有其他元素b(或以鏈表形式存在多個元素),則比較元素a與元素b的hash值:

如果hash值不相同,則元素a添加成功。—> 情況2
如果hash值相同,進而需要調用元素a所在類的equals()方法:

如果equals()返回true,元素a添加失敗
如果equals()返回false,則元素a添加成功。—>情況3

對于添加成功的情況2和情況3而言:元素a與已經存在指定索引位置上數據以鏈表的方式存儲。(七上八下)
jdk 7 : 新來元素a放到數組中,指向已存在的舊元素。
jdk 8 : 已存在的舊元素在數組中,指向新來元素a


底層為“數組+鏈表”,數組初始容量為16,當如果使用率超過0.75(16*0.75=12)就會擴大容量為原來的2倍。(16擴容為32,依次為64,128…等)

重寫equals()方法的時候一般都需要同時復寫hashCode()方法。通常參與計算hash值的對象的屬性也應該參與到equals()中進行計算



LinkedHashSet實現類

1、LinkedHashSet 是 HashSet 的子類,也是根據元素的 hashCode 值來決定元素的存儲位置,但它同時使用雙向鏈表維護元素的次序,這使得元素看起來是以插入順序保存的。

2、LinkedHashSet插入性能略低于 HashSet,但在迭代訪問(遍歷) Set 里的元素時有很好的性能。

3、LinkedHashSet 不允許集合元素重復。



TreeSet實現類

1、TreeSet 是 SortedSet 接口的實現類,TreeSet 可以確保集合元素處于排序狀態。元素應為相同類的對象。

2、TreeSet底層使用紅黑樹結構存儲數據。

3、TreeSet 兩種排序方法:自然排序和定制排序。默認情況下,TreeSet 采用自然排序。

4、自然排序
①TreeSet 會調用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關系,然后將集合元素按條件排列。如果試圖把一個對象添加到 TreeSet 時,則該對象的類必須實現 Comparable 接口。實現 Comparable 的類必須重寫compareTo(Object obj) 方法,兩個對象通過compareTo(Object obj) 方法的返回值來比較大小。
②向 TreeSet 中添加元素時,只有第一個元素無須比較compareTo()方法,后面添
加的所有元素都會調用compareTo()方法進行比較。
③因為只有相同類的兩個實例才會比較大小,所以向 TreeSet 中添加的應該是同
一個類的對象。
④對于 TreeSet 集合而言,它判斷兩個對象是否相等的唯一標準是兩個對象通過 compareTo(Object obj) 方法比較的返回值。

import java.util.Iterator; import java.util.TreeSet;/*** @Author: Yeman* @Date: 2021-09-16-16:48* @Description:*/class Student implements Comparable{String name;int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Override//姓名從小到大,年齡從大到小排列public int compareTo(Object o) {if (o instanceof Student){Student student = (Student) o;int nameResult = this.name.compareTo(student.name);if (nameResult == 0){return -Integer.compare(this.age,student.age);}else {return nameResult;}}else throw new RuntimeException("類型不匹配");}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }public class TreeSetTest {public static void main(String[] args) {TreeSet treeSet = new TreeSet();treeSet.add(new Student("Tom",18));treeSet.add(new Student("Tom",22));treeSet.add(new Student("jim",18));treeSet.add(new Student("Anne",19));treeSet.add(new Student("Lily",25));treeSet.add(new Student("LiLei",25));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}} }


5、定制排序
①定制排序,通過Comparator接口來實現,需要重寫compare(T o1,T o2)方法。
②要實現定制排序,需要將實現Comparator接口的實例作為形參傳遞給TreeSet的構造器。
③仍然只能向TreeSet中添加類型相同的對象。否則發生ClassCastException異常。
④使用定制排序判斷兩個元素相等的標準是:通過Comparator比較兩個元素返回了0。

import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet;/*** @Author: Yeman* @Date: 2021-09-16-16:48* @Description:*/class Student{String name;int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }public class TreeSetTest {public static void main(String[] args) {Comparator com = new Comparator() {@Overridepublic int compare(Object o1, Object o2) {if (o1 instanceof Student && o2 instanceof Student) {Student student1 = (Student) o1;Student student2 = (Student) o2;return Integer.compare(student1.age, student2.age);} else throw new RuntimeException("類型不匹配");}};TreeSet treeSet = new TreeSet(com);treeSet.add(new Student("Tom",18));treeSet.add(new Student("Tom",22));treeSet.add(new Student("jim",18));treeSet.add(new Student("Anne",19));treeSet.add(new Student("Lily",25));treeSet.add(new Student("LiLei",25));Iterator iterator = treeSet.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}} }

總結

以上是生活随笔為你收集整理的Java集合(5)--Set接口及其实现类HashSet、LinkedHashSet和TreeSet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。