欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的Set集合不允許存儲重復(fù)元素的原理詳解

 更新時間:2023年09月18日 10:25:19   作者:禿頭不禿頭農(nóng)  
這篇文章主要介紹了Java中的Set集合不允許存儲重復(fù)元素的原理詳解,我們之前使用Set集合的時候發(fā)現(xiàn),Set集合的特點是不允許存儲重復(fù)元素,這是為什么呢,下面我們一起來研究一下,需要的朋友可以參考下

Set集合不允許存儲重復(fù)元素的原理詳解

代碼如下(示例):

//創(chuàng)建hashset集合對象
        HashSet<String> set = new HashSet<>();
        String s1=new String("abc");
        String s2=new String("abc");
        set.add(s1);
        set.add(s2);
        set.add("重地");
        set.add("通話");//兩個特殊的字符串
        set.add("abc");
        System.out.println(set);

我們可以看到,我向set集合中存儲了三次abc和兩個特殊字符串,我們可以看到打印結(jié)果:

在這里插入圖片描述

我們可以發(fā)現(xiàn),集合中只有重地,通話,abc。為什么會出現(xiàn)這樣的結(jié)果呢。

第一步:我們創(chuàng)建了一個hashset集合。

//創(chuàng)建hashset集合對象
        HashSet<String> set = new HashSet<>();

我們一定是在堆內(nèi)存中開辟一塊空間。上一篇文章中我們說到hashset的結(jié)構(gòu)是:哈希表:數(shù)組+鏈表/紅黑樹。我們可以看到:

在這里插入圖片描述

注意:set集合在調(diào)用add方法時,會調(diào)用元素的hashcode和equals方法,判斷元素是否重復(fù)。 首先,我們向集合中存儲的第一個元素是s1

        set.add(s1);

add方法回調(diào)用s1.hashCode()方法,計算字符串a(chǎn)bc的哈希值(96354)。就會在集合中找有沒有96354這個哈希值的元素。發(fā)現(xiàn)沒有,就會將元素abc存儲到集合中去。

在這里插入圖片描述

當開始存儲存儲s2時,add方法回調(diào)用s2.hashCode()方法,計算字符串a(chǎn)bc的哈希值(96354)。就會在集合中找有沒有96354這個哈希值的元素。發(fā)現(xiàn)有,注意哈希值一樣就會發(fā)生哈希沖突。s2會調(diào)用equals方法和哈希值相同的元素進行比較:s2.equals(s1),equals方法返回ture,認定兩個元素相同,就不會把s2存儲到集合中。

之后我們就要存儲字符串重地:

        set.add("重地");

add方法回調(diào)用重地.hashCode()方法,計算字符串重地的哈希值(1179395)。就會在集合中找有沒有1179395這個哈希值的元素。發(fā)現(xiàn)沒有,就會將元素重地存儲到集合中去。

在這里插入圖片描述

接下來我們就該存儲通話。add方法回調(diào)用通話.hashCode()方法,計算字符串通話的哈希值(1179395)。就會在集合中找有沒有1179395這個哈希值的元素。發(fā)現(xiàn)有,就會調(diào)用equals方法進行比較:”通話“.equals(“重地”),返回false,認定兩個元素不相同,所以會將元素存儲在1179395同樣的位置上。

在這里插入圖片描述

這就是set元素存儲元素不重復(fù)的元素的原理。但是這有一個前提,存儲元素必須重寫hashcode和eqluas方法,保證元素不重復(fù)。

到此這篇關(guān)于Java中的Set集合不允許存儲重復(fù)元素的原理詳解的文章就介紹到這了,更多相關(guān)Set集合底層原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis映射文件mapper.xml的具體寫法

    mybatis映射文件mapper.xml的具體寫法

    在開發(fā)過程中,需要開發(fā)人員配置mapper映射文件,本文主要介紹了mybatis映射文件mapper.xml的具體寫法,感興趣的可以了解一下
    2021-09-09
  • MyBatis Plus中InnerInterceptor的實現(xiàn)

    MyBatis Plus中InnerInterceptor的實現(xiàn)

    本文主要介紹了MyBatis Plus中InnerInterceptor的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • IDEA?服務(wù)器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    IDEA?服務(wù)器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    這篇文章主要介紹了IDEA?服務(wù)器熱部署詳解(On?Update?action/On?frame?deactivation),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • java.io.NotSerializableException異常的問題及解決

    java.io.NotSerializableException異常的問題及解決

    這篇文章主要介紹了java.io.NotSerializableException異常的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot定時任務(wù)參數(shù)運行代碼實例解析

    SpringBoot定時任務(wù)參數(shù)運行代碼實例解析

    這篇文章主要介紹了SpringBoot定時任務(wù)運行代碼實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 解決Spring Cloud feign GET請求無法用實體傳參的問題

    解決Spring Cloud feign GET請求無法用實體傳參的問題

    這篇文章主要介紹了解決Spring Cloud feign GET請求無法用實體傳參的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • MySQL 新增字段但 Java 實體未更新存在潛在問題與解決方案

    MySQL 新增字段但 Java 實體未更新存在潛在問題與解決方案

    在 Java + MySQL 的開發(fā)中,我們通常使用 ORM 框架(如 MyBatis、MyBatis-Plus、Hibernate)來映射數(shù)據(jù)庫表與 Java 對象,這篇文章主要介紹了MySQL 新增字段但 Java 實體未更新:潛在問題與解決方案,需要的朋友可以參考下
    2025-04-04
  • Java多線程中Lock的使用小結(jié)

    Java多線程中Lock的使用小結(jié)

    jdk1.5 以后,提供了各種鎖,本文主要介紹了Java多線程中Lock的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Java實現(xiàn)單向鏈表反轉(zhuǎn)

    Java實現(xiàn)單向鏈表反轉(zhuǎn)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)單向鏈表反轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 深入理解Swift中的Substring和String

    深入理解Swift中的Substring和String

    這篇文章主要給大家深入的介紹了Swift中Substring和String的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03

最新評論