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

Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理

 更新時(shí)間:2019年07月25日 08:25:17   作者:Java螞蟻  
這篇文章主要介紹了Java面試題 從源碼角度分析HashSet實(shí)現(xiàn)原理?,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

面試官:請問HashSet有哪些特點(diǎn)?

應(yīng)聘者:HashSet實(shí)現(xiàn)自set接口,set集合中元素?zé)o序且不能重復(fù);

面試官:那么HashSet 如何保證元素不重復(fù)?

應(yīng)聘者:因?yàn)镠ashSet底層是基于HashMap實(shí)現(xiàn)的,當(dāng)你new一個(gè)HashSet時(shí)候,實(shí)際上是new了一個(gè)map,執(zhí)行add方法時(shí),實(shí)際上調(diào)用map的put方法,value始終是PRESENT,所以根據(jù)HashMap的一個(gè)特性: 將一個(gè)key-value對放入HashMap中時(shí),首先根據(jù)key的hashCode()返回值決定該Entry的存儲位置,如果兩個(gè)key的hash值相同,那么它們的存儲位置相同。

如果這個(gè)兩個(gè)key的equalus比較返回true。那么新添加的Entry的value會覆蓋原來的Entry的value,key不會覆蓋。因此,如果向HashSet中添加一個(gè)已經(jīng)存在的元素,新添加的集合元素不會覆蓋原來已有的集合元素;

源碼分析

先來看一下無參的構(gòu)造函數(shù):

public HashSet() {
  map = new HashMap<>();
}

很顯然,當(dāng)你new一個(gè)HashSet的時(shí)候,實(shí)際上是new了一個(gè)HashMap

再來看一下add方法:

private static final Object PRESENT = new Object();
 
public boolean add(E e) {
 return map.put(e, PRESENT)==null;
}

定義一個(gè)虛擬的Object PRESENT是向map中插入key-value對應(yīng)的value,因?yàn)镠ashSet中只需要用到key,而HashMap是key-value鍵值對;所以,向map中添加鍵值對時(shí),鍵值對的值固定是PRESENT。

源碼中HashSet的絕大部分方法都是通過調(diào)用HashMap的方法來實(shí)現(xiàn)的,其他的方法,就請大家自己查閱一下源碼吧。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證詳解

    spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證詳解

    這篇文章主要給大家介紹了關(guān)于spring boot+jwt實(shí)現(xiàn)api的token認(rèn)證的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • SpringBoot全局異常處理方式

    SpringBoot全局異常處理方式

    這篇文章主要介紹了SpringBoot全局異常處理方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題

    解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題

    這篇文章主要介紹了idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot整合Mongodb實(shí)現(xiàn)增刪查改的方法

    SpringBoot整合Mongodb實(shí)現(xiàn)增刪查改的方法

    這篇文章主要介紹了SpringBoot整合Mongodb實(shí)現(xiàn)簡單的增刪查改,MongoDB是一個(gè)以分布式數(shù)據(jù)庫為核心的數(shù)據(jù)庫,因此高可用性、橫向擴(kuò)展和地理分布是內(nèi)置的,并且易于使用。況且,MongoDB是免費(fèi)的,開源的,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • Java實(shí)現(xiàn)字符串反轉(zhuǎn)的常用方法小結(jié)

    Java實(shí)現(xiàn)字符串反轉(zhuǎn)的常用方法小結(jié)

    在Java中,你可以使用多種方法來反轉(zhuǎn)字符串,這篇文章主要為大家整理了幾種常見的反轉(zhuǎn)字符串的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • java課程設(shè)計(jì)之坦克大戰(zhàn)

    java課程設(shè)計(jì)之坦克大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了java課程設(shè)計(jì)之坦克大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • spring NamedContextFactory實(shí)現(xiàn)服務(wù)隔離的示例詳解

    spring NamedContextFactory實(shí)現(xiàn)服務(wù)隔離的示例詳解

    假設(shè)我們有個(gè)場景,我們需要實(shí)現(xiàn)服務(wù)之間的數(shù)據(jù)隔離、配置隔離、依賴的spring bean之間隔離,大家會有什么實(shí)現(xiàn)思路?今天給大家介紹spring-cloud-context里面有個(gè)NamedContextFactory可以達(dá)到上面的效果,需要的朋友可以參考下
    2024-05-05
  • Java實(shí)現(xiàn)簡單學(xué)生信息管理系統(tǒng)

    Java實(shí)現(xiàn)簡單學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式

    Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式)

    SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式)

    這篇文章主要介紹了SpringAMQP消息隊(duì)列(SpringBoot集成RabbitMQ方式),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論