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

Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解

 更新時(shí)間:2023年09月05日 10:00:51   作者:CodingALife  
這篇文章主要介紹了Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解,如果你需要一個(gè)訪問快速的Set,你應(yīng)該使用HashSet,當(dāng)你需要一個(gè)排序的Set,你應(yīng)該使用TreeSet,當(dāng)你需要記錄下插入時(shí)的順序時(shí),你應(yīng)該使用LinedHashSet,需要的朋友可以參考下

HashSet、LinkedHashSet、TreeSet區(qū)別

如果你需要一個(gè)訪問快速的Set,你應(yīng)該使用HashSet;當(dāng)你需要一個(gè)排序的Set,你應(yīng)該使用TreeSet;當(dāng)你需要記錄下插入時(shí)的順序時(shí),你應(yīng)該使用LinedHashSet。

HashSet是采用hash表來實(shí)現(xiàn)的。其中的元素沒有按順序排列,add()、remove()以及contains()等方法都是復(fù)雜度為O(1)的方法。

TreeSet是采用樹結(jié)構(gòu)實(shí)現(xiàn)(紅黑樹算法)。元素是按順序進(jìn)行排列,但是add()、remove()以及contains()等方法都是復(fù)雜度為O(log (n))的方法。

它還提供了一些方法來處理排序的set,如first(), last(), headSet(), tailSet()等等。

LinkedHashSet介于HashSet和TreeSet之間。它也是一個(gè)hash表,但是同時(shí)維護(hù)了一個(gè)雙鏈表來記錄插入的順序?;痉椒ǖ膹?fù)雜度為O(1)。

一、HashSet

  • 不能保證元素的排列順序,順序有可能發(fā)生變化
  • 不是同步的,非線程安全
  • 集合元素可以是null,但只能放入一個(gè)null
  • 當(dāng)向HashSet結(jié)合中存入一個(gè)元素時(shí),HashSet會(huì)調(diào)用該對(duì)象的hashCode()方法來得到該對(duì)象的hashCode值,然后根據(jù) hashCode值來決定該對(duì)象在HashSet中存儲(chǔ)位置。
  • 簡單的說,HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過equals方法比較相等,并且兩個(gè)對(duì)象的hashCode()方法返回值相等
  • 注意,如果要把一個(gè)對(duì)象放入HashSet中,重寫該對(duì)象對(duì)應(yīng)類的equals方法,也應(yīng)該重寫其hashCode()方法。其規(guī)則是如果兩個(gè)對(duì)象通過equals方法比較返回true時(shí),其hashCode也應(yīng)該相同。另外,對(duì)象中用作
  • equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來計(jì)算hashCode的值。

二、LinkedHashSet

nkedHashSet集合同樣是根據(jù)元素的hashCode值來決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當(dāng)遍歷該集合時(shí)候,LinkedHashSet將會(huì)以元素的添加順序訪問集合的元素。

  1. LinkedHashSet中不能有相同元素,可以有一個(gè)Null元素,元素嚴(yán)格按照放入的順序排列。
  2. LinkedHashSet如何保證有序和唯一性?
    • 底層數(shù)據(jù)結(jié)構(gòu)由哈希表和鏈表組成。
    • 鏈表保證了元素的有序即存儲(chǔ)和取出一致,哈希表保證了元素的唯一性。
  3. 添加、刪除操作時(shí)間復(fù)雜度都是O(1)。
  4. 非線程安全

三、TreeSet

TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。

TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。

向TreeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。

TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0

自然排序

自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關(guān)系,然后將元素按照升序排列。

定制排序

自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應(yīng)該使用Comparator接口,實(shí)現(xiàn) int compare(T o1,T o2)方法

1.TreeSet是中不能有相同元素,不可以有Null元素,根據(jù)元素的自然順序進(jìn)行排序。

2.TreeSet如何保證元素的排序和唯一性?

底層的數(shù)據(jù)結(jié)構(gòu)是紅黑樹(一種自平衡二叉查找樹)

3.添加、刪除操作時(shí)間復(fù)雜度都是O(log(n))

4.非線程安全

TreeSet排序如下

public class Person3 {
    private int age;
    private String name;
    public Person3(String name, int age){
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
    public static void main(String[] args) {
        Set<Person3> set = new TreeSet<>(new Comparator<Person3>() {
            @Override
            public int compare(Person3 o1, Person3 o2) {
                if(o1 == null || o2 == null){
                    return 0;
                }
                return o1.age - o2.age;
            }
        });
        set.add(new Person3("zzh",18));
        set.add(new Person3("jj",17));
        set.add(new Person3("qq",19));
        set.add(new Person3(null,19));
        //[Person{age=17, name='jj'}, Person{age=18, name='zzh'}, Person{age=19, name='qq'}]
        System.out.println(set);
    }

四.總結(jié)

通過以上特點(diǎn)可以分析出,三者都保證了元素的唯一性,如果無排序要求可以選用HashSet;

如果想取出元素的順序和放入元素的順序相同,那么可以選用LinkedHashSet。如果想插入、刪除立即排序或者按照一定規(guī)則排序可以選用TreeSet。

到此這篇關(guān)于Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解的文章就介紹到這了,更多相關(guān)HashSet、LinkedHashSet和TreeSet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于springboot忽略接口,參數(shù)注解的使用ApiIgnore

    關(guān)于springboot忽略接口,參數(shù)注解的使用ApiIgnore

    這篇文章主要介紹了關(guān)于springboot忽略接口,參數(shù)注解的使用ApiIgnore,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring中Cache的使用方法詳解

    Spring中Cache的使用方法詳解

    這篇文章主要介紹了Spring中Cache的使用方法詳解,Spring Cache 是一個(gè)框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能,Spring Cache 提供了一層抽象,底層可以切換不同的緩存實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • idea install 時(shí)提示jdk的某個(gè)jar包的包不存在的問題

    idea install 時(shí)提示jdk的某個(gè)jar包的包不存在的問題

    這篇文章主要介紹了idea install 時(shí)提示jdk的某個(gè)jar包的包不存在的問題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java中Scanner的使用及nextLine和nextInt等混用報(bào)錯(cuò)解決方案

    Java中Scanner的使用及nextLine和nextInt等混用報(bào)錯(cuò)解決方案

    Scanner類用于從控制臺(tái)輸入數(shù)據(jù),常用方法包括next()、nextLine()、nextInt()、nextDouble()和nextBoolean(),案例測試和常見錯(cuò)誤情況分析表明,nextDouble等方法不會(huì)跳過空格和回車,而nextLine會(huì)讀取整行并跳到下一行
    2026-03-03
  • java如何用正則表達(dá)式匹配與提取字符串

    java如何用正則表達(dá)式匹配與提取字符串

    一位以前的同事在群里面突然發(fā)了個(gè)需求,要通過正則表達(dá)式來取值,下面這篇文章主要給大家介紹了關(guān)于java如何用正則表達(dá)式匹配與提取字符串的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Java8中Optional的使用方法詳解

    Java8中Optional的使用方法詳解

    這篇文章主要介紹了Java8中Optional的使用方法詳解,傳統(tǒng)的寫代碼方式經(jīng)常會(huì)遇到NullPointerException,這就需要我們?cè)诖a中經(jīng)常判空,而判空的寫法又會(huì)顯得很累贅,這里就可以用到Optional來簡化代碼,需要的朋友可以參考下
    2024-01-01
  • Springboot項(xiàng)目對(duì)數(shù)據(jù)庫用戶名密碼實(shí)現(xiàn)加密過程解析

    Springboot項(xiàng)目對(duì)數(shù)據(jù)庫用戶名密碼實(shí)現(xiàn)加密過程解析

    這篇文章主要介紹了Springboot項(xiàng)目對(duì)數(shù)據(jù)庫用戶名密碼實(shí)現(xiàn)加密過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot 中 MyBatis 與 Spring Data JPA 的優(yōu)缺點(diǎn)對(duì)比

    Spring Boot 中 MyBatis 與 Spring 

    這篇文章主要介紹了Spring Boot 中 MyBatis 與 Spring Data JPA 的優(yōu)缺點(diǎn)對(duì)比,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • Java基礎(chǔ)學(xué)習(xí)之實(shí)參和形參

    Java基礎(chǔ)學(xué)習(xí)之實(shí)參和形參

    這篇文章主要介紹了Java基礎(chǔ)學(xué)習(xí)之實(shí)參形參,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • spring中@Bean和@Component的區(qū)別及說明

    spring中@Bean和@Component的區(qū)別及說明

    文章主要介紹了@Bean和@Component兩個(gè)注解在Spring框架中的定義、作用范圍、創(chuàng)建方式、掃描和識(shí)別機(jī)制以及使用場景和建議
    2024-12-12

最新評(píng)論

阿坝县| 固原市| 雷山县| 峨山| 桦南县| 会理县| 灵丘县| 无锡市| 林口县| 漳浦县| 福州市| 涟源市| 宜城市| 讷河市| 同江市| 二手房| 施秉县| 巫溪县| 饶河县| 北宁市| 三都| 来宾市| 望奎县| 涿鹿县| 荃湾区| 灵宝市| 巴林左旗| 喀喇沁旗| 吐鲁番市| 峨边| 韶山市| 锡林浩特市| 昌邑市| 乌拉特后旗| 滦南县| 随州市| 阿拉尔市| 五华县| 昌图县| 昌宁县| 阿拉善左旗|