最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java集合之Set接口及其實(shí)現(xiàn)類精解

 更新時間:2021年09月29日 10:58:46   作者:葉綠體不忘呼吸  
set接口是繼承自Collection的子接口,特點(diǎn)是元素不重復(fù),存儲無序。在set接口的實(shí)現(xiàn)類中添加重復(fù)元素是不會成功的,判斷兩個元素是否重復(fù)根據(jù)元素類重寫的

Set接口概述

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

在這里插入圖片描述

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

HashSet實(shí)現(xiàn)類

1、HashSet 具有以下特點(diǎn):

①不能保證元素的排列順序
②HashSet 不是線程安全的
③集合元素可以是 null

2、HashSet 集合判斷兩個元素相等的標(biāo)準(zhǔn)

兩個對象通過 hashCode() 方法比較相等,并且兩個對象的 equals() 方法返回值也相等。因此對于存放在Set容器中的對象,對應(yīng)的類一定要重寫equals()和hashCode()方法,以實(shí)現(xiàn)對象相等規(guī)則,即:“相等的對象必須具有相等的散列碼”。

3、向HashSet中添加元素的過程

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

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

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

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

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

在這里插入圖片描述

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

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

在這里插入圖片描述

LinkedHashSet實(shí)現(xiàn)類

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

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

3、LinkedHashSet 不允許集合元素重復(fù)。

在這里插入圖片描述

TreeSet實(shí)現(xiàn)類

1、TreeSet 是 SortedSet 接口的實(shí)現(xiàn)類,TreeSet 可以確保集合元素處于排序狀態(tài)。元素應(yīng)為相同類的對象。

2、TreeSet底層使用紅黑樹結(jié)構(gòu)存儲數(shù)據(jù)。

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

4、自然排序
①TreeSet 會調(diào)用集合元素的 compareTo(Object obj) 方法來比較元素之間的大小關(guān)系,然后將集合元素按條件排列。如果試圖把一個對象添加到 TreeSet 時,則該對象的類必須實(shí)現(xiàn) Comparable 接口。實(shí)現(xiàn) Comparable 的類必須重寫compareTo(Object obj) 方法,兩個對象通過compareTo(Object obj) 方法的返回值來比較大小。
②向 TreeSet 中添加元素時,只有第一個元素?zé)o須比較compareTo()方法,后面添
加的所有元素都會調(diào)用compareTo()方法進(jìn)行比較。
③因?yàn)橹挥邢嗤惖膬蓚€實(shí)例才會比較大小,所以向 TreeSet 中添加的應(yīng)該是同
一個類的對象。
④對于 TreeSet 集合而言,它判斷兩個對象是否相等的唯一標(biāo)準(zhǔn)是兩個對象通過 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("類型不匹配");
    }

    @Override
    public 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接口來實(shí)現(xiàn),需要重寫compare(T o1,T o2)方法。
②要實(shí)現(xiàn)定制排序,需要將實(shí)現(xiàn)Comparator接口的實(shí)例作為形參傳遞給TreeSet的構(gòu)造器。
③仍然只能向TreeSet中添加類型相同的對象。否則發(fā)生ClassCastException異常。
④使用定制排序判斷兩個元素相等的標(biāo)準(zhǔn)是:通過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;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class TreeSetTest {
    public static void main(String[] args) {
        Comparator com = new Comparator() {
            @Override
            public 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());
        }
    }
}

在這里插入圖片描述

到此這篇關(guān)于Java集合之Set接口及其實(shí)現(xiàn)類精解的文章就介紹到這了,更多相關(guān)Java Set接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot啟動yaml報錯的解決

    SpringBoot啟動yaml報錯的解決

    這篇文章主要介紹了SpringBoot啟動yaml報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

    Java協(xié)程編程之Loom項(xiàng)目實(shí)戰(zhàn)記錄

    這篇文章主要介紹了Java協(xié)程編程之Loom項(xiàng)目嘗鮮,如果用嘗鮮的角度去使用Loom項(xiàng)目,可以提前窺探JVM開發(fā)者們是如何基于協(xié)程這個重大特性進(jìn)行開發(fā)的,這對于提高學(xué)習(xí)JDK內(nèi)核代碼的興趣有不少幫助,需要的朋友可以參考下
    2021-08-08
  • Java中List轉(zhuǎn)Map List實(shí)現(xiàn)的幾種姿勢

    Java中List轉(zhuǎn)Map List實(shí)現(xiàn)的幾種姿勢

    本文主要介紹了Java中List轉(zhuǎn)Map List實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 使用Java實(shí)現(xiàn)轉(zhuǎn)換掃描的文檔為可搜索的PDF

    使用Java實(shí)現(xiàn)轉(zhuǎn)換掃描的文檔為可搜索的PDF

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)轉(zhuǎn)換掃描的文檔為可搜索的PDF,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的圖文介紹

    IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的圖文介紹

    這篇文章主要介紹了IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的方法,包括配置方式及優(yōu)先級,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Spring Boot實(shí)現(xiàn)郵件發(fā)送必會的5種姿勢

    Spring Boot實(shí)現(xiàn)郵件發(fā)送必會的5種姿勢

    這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件發(fā)送必會的5種姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索

    JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索

    本文主要介紹了JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • springboot配置允許跨域訪問代碼實(shí)例

    springboot配置允許跨域訪問代碼實(shí)例

    這篇文章主要介紹了springboot配置允許跨域訪問代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢

    MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢

    這篇文章主要介紹了MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼

    Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息的完整代碼

    kakfa是我們在項(xiàng)目開發(fā)中經(jīng)常使用的消息中間件。由于它的寫性能非常高,因此,經(jīng)常會碰到讀取Kafka消息隊(duì)列時擁堵的情況,這篇文章主要介紹了Spring?Boot?中使用@KafkaListener并發(fā)批量接收消息,需要的朋友可以參考下
    2023-02-02

最新評論

建湖县| 长顺县| 定边县| 浑源县| 昆山市| 夏津县| 平乐县| 汕尾市| 泾川县| 马公市| 辛集市| 蒲城县| 蓝山县| 宿州市| 阜南县| 车险| 隆子县| 鸡西市| 吉安县| 保德县| 会宁县| 白朗县| 盱眙县| 仲巴县| 孝昌县| 杭州市| 洛浦县| 湖北省| 繁昌县| 邯郸市| 雷波县| 阿拉善右旗| 资源县| 临猗县| 广水市| 玛多县| 文水县| 益阳市| 丁青县| 昌邑市| 盐源县|