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

為什么ConcurrentHashMap的key value不能為null,map可以?

 更新時間:2021年01月21日 17:18:52   作者:反光的小魚兒  
這篇文章主要介紹了為什么ConcurrentHashMap的key value不能為null,map可以呢?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

源碼

if (key == null || value == null) throw new NullPointerException();

二義性

假定ConcurrentHashMap也可以存放value為null的值。那不管是HashMap還是ConcurrentHashMap調(diào)用map.get(key)的時候,如果返回了null,那么這個null,

都有兩重含義:

1.這個key從來沒有在map中映射過。

2.這個key的value在設(shè)置的時候,就是null。

為什么map允許value=null

對于HashMap的正確使用場景是在單線程下使用。

在單線程中,當(dāng)我們得到的value是null的時候,我可以用hashMap.containsKey(key)方法來區(qū)分上面說的兩重含義。

所以當(dāng)map.get(key)返回的值是null,在HashMap中雖然存在二義性,但是結(jié)合containsKey方法可以避免二義性。

為什么ConcurrentHashMap不允許

ConcurrentHashMap的使用場景為多線程。

用反證法來推理,假設(shè)concurrentHashMap允許存放值為null的value。

這時有A、B兩個線程。

線程A調(diào)用concurrentHashMap.get(key)方法,返回為null,我們還是不知道這個null是沒有映射的null還是存的值就是null。

我們假設(shè)此時返回為null的真實情況就是因為這個key沒有在map里面映射過。那么我們可以用concurrentHashMap.containsKey(key)來驗證我們的假設(shè)是否成立,我們期望的結(jié)果是返回false。

但是在我們調(diào)用concurrentHashMap.get(key)方法之后,containsKey方法之前,有一個線程B執(zhí)行了concurrentHashMap.put(key,null)的操作。那么我們調(diào)用containsKey方法返回的就是true了。這就與我們的假設(shè)的真實情況不符合了。也就是上面說的二義性。

對于key不能為null

源碼就是這樣。。

補充:Hashtable/HashMap與key/value為null的關(guān)系

1、 HashMap計算key的hash值時調(diào)用單獨的方法,在該方法中會判斷key是否為null,如果是則返回0;而Hashtable中則直接調(diào)用key的hashCode()方法,因此如果key為null,則拋出空指針異常。

2、 HashMap將鍵值對添加進數(shù)組時,不會主動判斷value是否為null;而Hashtable則首先判斷value是否為null。

3、以上原因主要是由于Hashtable繼承自Dictionary,而HashMap繼承自AbstractMap。

4、雖然ConcurrentHashMap也繼承自AbstractMap,但是其也過濾掉了key或value為null的鍵值對。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    這篇文章主要介紹了springboot?web項目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • java中volatile和synchronized的區(qū)別與聯(lián)系

    java中volatile和synchronized的區(qū)別與聯(lián)系

    這篇文章主要介紹了java中volatile和synchronized的區(qū)別與聯(lián)系的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • springmvc數(shù)據(jù)的封裝過程詳解

    springmvc數(shù)據(jù)的封裝過程詳解

    這篇文章主要介紹了springmvc數(shù)據(jù)的封裝過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • springboot2中session超時,退到登錄頁面方式

    springboot2中session超時,退到登錄頁面方式

    這篇文章主要介紹了springboot2中session超時,退到登錄頁面方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java爬蟲jsoup解析HTML的工具學(xué)習(xí)

    java爬蟲jsoup解析HTML的工具學(xué)習(xí)

    jsoup是一個解析HTML的第三方j(luò)ava庫,它提供了一套非常方便的API,可使用DOM,CSS以及類jQuery的操作方法來取出和操作數(shù)據(jù),本文就來開始jsoup的使用學(xué)習(xí)
    2022-07-07
  • SpringBoot整合阿里云視頻點播的過程詳解

    SpringBoot整合阿里云視頻點播的過程詳解

    視頻點播(ApsaraVideo for VoD)是集音視頻采集、編輯、上傳、自動化轉(zhuǎn)碼處理、媒體資源管理、分發(fā)加速于一體的一站式音視頻點播解決方案。這篇文章主要介紹了SpringBoot整合阿里云視頻點播的詳細過程,需要的朋友可以參考下
    2021-12-12
  • struts2實現(xiàn)文件下載功能

    struts2實現(xiàn)文件下載功能

    這篇文章主要為大家詳細介紹了struts2實現(xiàn)文件下載功能,一個非常常見的功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 關(guān)于idea無法修改模板中jdk版本問題

    關(guān)于idea無法修改模板中jdk版本問題

    這篇文章主要介紹了關(guān)于idea無法修改模板中jdk版本問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    這篇文章主要介紹了MyBatis多表聯(lián)合查詢resultType的返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java空集合使用場景與填坑記錄

    Java空集合使用場景與填坑記錄

    這篇文章主要給大家介紹了關(guān)于Java空集合使用場景與填坑的相關(guān)資料,并且給大家介紹了java判斷集合是否為空的方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08

最新評論

临泉县| 桂林市| 彭州市| 巨鹿县| 休宁县| 多伦县| 湘西| 宣武区| 南康市| 东阿县| 莱州市| 沂水县| 昆山市| 两当县| 靖安县| 土默特右旗| 南部县| 孟州市| 兰坪| 凤庆县| 许昌市| 邢台市| 章丘市| 萝北县| 崇阳县| 洛隆县| 余姚市| 健康| 衡南县| 平安县| 鄂伦春自治旗| 武强县| 清苑县| 阿城市| 榆树市| 莲花县| 澄江县| 保亭| 青冈县| 农安县| 苏尼特右旗|