国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么ConcurrentHashMap不允許插null?

開發(fā) 前端
在 Java 語言中,HashMap 這種單線程下使用的集合是可以設(shè)置 null 值的,而并發(fā)集合如 ConcurrentHashMap 或 Hashtable 是不允許給 key 或 value 設(shè)置 null 值的,這是 JDK 源碼層面直接實(shí)現(xiàn)的,這樣設(shè)計(jì)的目的主要是為了防止并發(fā)場景下的歧義問題。

在 Java 語言中,ConcurrentHashMap 和 Hashtable 這些線程安全的集合是不允許 key 或 value 插入 null 值的,而 HashMap 又允許 key 或 value 插入 null 值,這到底是為什么呢?

null 值插入演示

首先給 HashMap 插入 null 值,實(shí)現(xiàn)代碼如下:

HashMap<String, Object> map = new HashMap();
// 插入 null 值
map.put(null, null);
if (map.containsKey(null)) {
    System.out.println("存在 null");
} else {
    System.out.println("不存在 null");
}

以上程序的執(zhí)行結(jié)果如下:

圖片圖片

從上述結(jié)果可以看出,HashMap 是允許 key 或 value 插入 null 值的。接著我們使用同樣的方式嘗試給 ConcurrentHashMap 的 key 和 value 插入 null 值,實(shí)現(xiàn)代碼如下:

圖片圖片

編譯階段沒有報(bào)錯(cuò),執(zhí)行以上程序,得到的結(jié)果如下:

圖片圖片

從上述報(bào)錯(cuò)信息可以看出,使用 ConcurrentHashMap 是不能插入 null 值的,否者程序在運(yùn)行期間就會(huì)報(bào)空指針異常。

PS:Hashtable 使用與 ConcurrentHashMap 類似,這里就不再重復(fù)演示了。

ConcurrentHashMap 源碼分析

為了尋找報(bào)錯(cuò)的原因,我們嘗試打開 ConcurrentHashMap 的源碼一探究竟。打開 ConcurrentHashMap 添加元素的方法 put 實(shí)現(xiàn)源碼如下:

圖片圖片

從上述源碼可以看出,在添加方法的第一句就加了判斷:如果 key 值為 null 或者是 value 值為 null,就直接拋出異常 NullPointerException 空指針異常,這就是咱們前面程序報(bào)錯(cuò)的原因了。

探索最終原因

通過上面源碼分析,我們似乎已經(jīng)找到了 ConcurrentHashMap 不允許插入 null 值的原因,用一句話概括就是:烏龜?shù)钠ü伞耙?guī)定”!然而,這個(gè)原因是不能說服面試官的,雖然源碼是這樣設(shè)計(jì)的,但我們要思考的是,這樣設(shè)計(jì)背后更深層次的原因,為什么 ConcurrentHashMap 不允許插入 null?而 HashMap 又允許插入 null 呢?

二義性問題

所謂的二義性問題是指含義不清或不明確。我們假設(shè) ConcurrentHashMap 允許插入 null,那么此時(shí)就會(huì)有二義性問題,它的二義性含義有兩個(gè):

  1. 值沒有在集合中,所以返回 null。
  2. 值就是 null,所以返回的就是它原本的 null 值。

可以看出這就是 ConcurrentHashMap 的二義性問題,那為什么 HashMap 就不怕二義性問題呢?

可證偽的 HashMap

上面說到 HashMap 是不怕二義性問題的,為什么呢?這是因?yàn)?HashMap 的設(shè)計(jì)是給單線程使用的,所以如果查詢到了 null 值,我們可以通過 hashMap.containsKey(key) 的方法來區(qū)分這個(gè) null 值到底是存入的 null?還是壓根不存在的 null?這樣二義性問題就得到了解決,所以 HashMap 不怕二義性問題。

不可證偽的 ConcurrentHashMap

而 ConcurrentHashMap 就不一樣了,因?yàn)?ConcurrentHashMap 使用的場景是多線程,所以它的情況更加復(fù)雜。我們假設(shè) ConcurrentHashMap 可以存入 null 值,有這樣一個(gè)場景,現(xiàn)在有一個(gè)線程 A 調(diào)用了 concurrentHashMap.containsKey(key),我們期望返回的結(jié)果是 false,但在我們調(diào)用 concurrentHashMap.containsKey(key) 之后,未返回結(jié)果之前,線程 B 又調(diào)用了 concurrentHashMap.put(key,null) 存入了 null 值,那么線程 A 最終返回的結(jié)果就是 true 了,這個(gè)結(jié)果和我們之前預(yù)想的 false 完全不一樣。也就是說,多線程的狀況非常復(fù)雜,我們沒辦法判斷某一個(gè)時(shí)刻返回的 null 值,到底是值為 null,還是壓根就不存在,也就是二義性問題不可被證偽,所以 ConcurrentHashMap 才會(huì)在源碼中這樣設(shè)計(jì),直接杜絕 key 或 value 為 null 的歧義問題。

ConcurrentHashMap 設(shè)計(jì)者的回答

對于 ConcurrentHashMap 不允許插入 null 值的問題,有人問過 ConcurrentHashMap 的作者 Doug Lea,以下是他回復(fù)的郵件內(nèi)容:

The main reason that nulls aren't allowed in ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that may be just barely tolerable in non-concurrent maps can't be accommodated. The main one is that if map.get(key) returns null, you can't detect whether the key explicitly maps to null vs the key isn't mapped. In a non-concurrent map, you can check this via map.contains(key),but in a concurrent one, the map might have changed between calls. Further digressing: I personally think that allowing nulls in Maps (also Sets) is an open invitation for programs to contain errors that remain undetected until they break at just the wrong time. (Whether to allow nulls even in non-concurrent Maps/Sets is one of the few design issues surrounding Collections that Josh Bloch and I have long disagreed about.)

It is very difficult to check for null keys and values in my entire application .

Would it be easier to declare somewhere     static final Object NULL = new Object(); and replace all use of nulls in uses of maps with NULL? -Doug

以上信件的主要意思是,Doug Lea 認(rèn)為這樣設(shè)計(jì)最主要的原因是:不容忍在并發(fā)場景下出現(xiàn)歧義!

總結(jié)

在 Java 語言中,HashMap 這種單線程下使用的集合是可以設(shè)置 null 值的,而并發(fā)集合如 ConcurrentHashMap 或 Hashtable 是不允許給 key 或 value 設(shè)置 null 值的,這是 JDK 源碼層面直接實(shí)現(xiàn)的,這樣設(shè)計(jì)的目的主要是為了防止并發(fā)場景下的歧義問題。

參考文檔

cnblogs.com/fanguangdexiaoyuer/p/12335921.html

責(zé)任編輯:武曉燕 來源: Java面試真題解析
相關(guān)推薦

2022-05-08 18:18:40

JDKValueHashMap

2022-01-27 07:02:52

JavaHashMap單線程

2009-06-18 10:47:44

java接口定義變量

2024-09-03 09:45:36

2021-08-23 12:54:12

開發(fā)技能代碼

2015-08-17 10:16:00

CentOSDocker命令root

2014-06-30 14:53:49

Android定制google

2020-08-20 11:12:14

iOS 13.6蘋果降級(jí)

2011-04-22 10:15:56

Novell專利

2025-03-27 01:10:00

HashMap分段鎖CAS

2010-06-01 16:12:00

2010-11-02 15:08:40

設(shè)置db2主鍵

2011-03-01 14:12:12

FreebsdProftpd

2010-05-20 13:03:52

IIS父路徑

2009-09-22 15:54:42

CCIE筆試

2010-11-11 16:53:28

SQL Server視

2023-05-23 08:54:43

SRESLO運(yùn)營

2012-01-04 21:24:13

Android 4.0

2023-05-09 10:05:24

HashMapNull

2018-06-13 10:08:05

蘋果數(shù)據(jù)開發(fā)者
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久综合另类图片小说| 乱人伦精品视频在线观看| 国产精品嫩草视频| 奇米影视四色在线| 欧美日本三区| 日本一区免费看| 成人v精品蜜桃久久一区| 99久久国产宗和精品1上映| 久久久www成人免费无遮挡大片| 黄色无遮挡网站| 亚洲婷婷综合久久一本伊一区 | 国产免费播放一区二区| 在线电影中文日韩| 欧美激情在线精品一区二区三区| 成人免费视频网址| 国产·精品毛片| 欧美12一14sex性hd| 日韩午夜av一区| 免费视频亚洲| 国产专区在线视频| 日本一区二区综合亚洲| 在线观看污网站| 亚洲老头同性xxxxx| 天天做天天爱天天综合网| 正在播放久久| 国产suv精品一区二区三区| 97福利电影| 欧美一级夜夜爽| 亚洲成人高清| 免费在线观看91| 福利一区二区在线观看| 黄动漫视频高清在线| 欧美成aaa人片免费看| 国产一区二区三区四区老人| 国产精品乱码久久久久| 日韩国产欧美区| 国产精品毛片一区二区在线看| 成人黄色大片在线免费观看| 亚洲尤物精选| 国产精品亚洲αv天堂无码| 制服丝袜中文字幕一区| 国产精品一区二区三区www| 在线播放国产精品二区一二区四区| 日本韩国欧美| 免费av在线一区二区| 日韩国产高清视频在线| 678在线观看视频| 国产精品免费一区豆花| 国产精品99久久久| a级毛片免费观看在线| 成人情趣片在线观看免费| 中文字幕精品一区二区精品绿巨人| 亚洲欧洲高清| 少妇高潮流白浆| 日韩美女免费观看| 老司机精品在线| 久久中文精品视频| 国产v综合v| 国产黄色免费在线观看| 男女猛烈激情xx00免费视频| 久久国产精品视频| 久久综合九色欧美综合狠狠| 天堂中文字幕在线| 久久免费视频这里只有精品| 一区二区三区中文字幕精品精品| 亚洲天堂av在线播放| 亚洲午夜视频| 成人午夜激情av| 我要看一级黄色大片| 国产日韩中文字幕| 欧美tickling挠脚心丨vk| 天堂成人国产精品一区| 欧美xxxxxxxxx59| 欧美国产极速在线| 日韩欧美成人一区二区| 欧美日本亚洲韩国国产| 成人嫩草影院免费观看| 色88888久久久久久影院野外| 欧洲精品99毛片免费高清观看| 91久久久久久久久久久| 成人短视频下载| 成人精品一区二区三区校园激情 | 人人九九精品视频| 精品少妇人妻av免费久久洗澡| 久久伊人色综合| 国产精品网曝门| 欧美视频导航| wwww在线观看免费视频| 动漫av免费观看| 日韩美女写真福利在线观看| 欧美在线啊v一区| 国产成人免费av在线| 深夜福利在线视频| 久久9精品区-无套内射无码| 久久久影院一区二区三区| 中文字幕欧美视频在线| 欧美激情自拍偷拍| 天天做天天爱天天爽综合网| 中文字幕日本一区二区| 国产香蕉尹人视频在线| 91丨porny丨探花| 国产高清自拍一区| 久久久久中文字幕| 日韩精品一区二区三区中文精品| 亚洲大片精品永久免费| 久久午夜电影网| 精品亚洲成a人| 欧美成人一品| 天天躁日日躁狠狠躁欧美| 祥仔av免费一区二区三区四区| 91露出在线| 午夜爽爽爽男女免费观看影院| 日韩欧美三级电影| 国产欧美 在线欧美| 97激碰免费视频| 久久成人综合视频| 7777精品伊人久久久大香线蕉| 精品日本高清在线播放| 亚洲免费观看视频| 国产午夜精品一区二区| 国产一区二区三区在线观看免费视频| 午夜国产一区二区| 欧美日韩p片| 国产精品久久久久av蜜臀| 成人在线观看黄| 椎名由奈jux491在线播放| 中文字幕中文字幕一区三区| 国产精品日韩一区二区免费视频 | 欧洲亚洲免费在线| 日韩视频中午一区| 一区二区成人在线| 成人免费视频视频在线观看免费| 捆绑紧缚一区二区三区视频| 久久爱www久久做| 国产精品一区不卡| 不卡的av电影在线观看| 国产欧美一区二区精品仙草咪| 中文字幕免费不卡| 亚洲私人影院在线观看| 播五月开心婷婷综合| 国产在线看一区| 91影院在线免费观看| 欧美性感美女一区二区| 欧美极品在线观看| 亚洲久久一区二区| sdde在线播放一区二区| 国内不卡的二区三区中文字幕| 国产精品欧美一区喷水| 欧美一级视频精品观看| 久久久久久999| 少妇特黄a一区二区三区| 777久久久精品一区二区三区 | 在线成人免费网站| 久久久久久久免费| 在线看的网站你懂| 欧美a大片欧美片| 99久久亚洲一区二区三区青草| 日韩三级视频中文字幕| 国产精品永久免费在线| 日韩国产一级片| 欧美性猛片xxxxx免费中国 | 美日韩精品免费观看视频| 欧美性色黄大片人与善| 欧美日韩国产综合视频| 色97色成人| 国产精品久久久久精k8| 久久久成人精品视频| 日本黄大片在线观看| 国模精品视频| 麻豆成人久久精品二区三区红| 91精品久久久久久久久99蜜臂| 亚洲综合在线中文字幕| 国产.com| 欧美调教视频| 国产黄色精品视频| 亚洲欧美综合精品久久成人| 亚洲一卡二卡三卡四卡无卡网站在线看 | 欧美va天堂在线| 欧美激情一区三区| 中文字幕少妇一区二区三区| 日韩精品久久一区| 国内av一区二区三区| 久久精品66| 国产精品网曝门| 久久影院资源网| 永久免费看av| sqte在线播放| 亚洲人妖在线| 欧美综合亚洲图片综合区| 2021年精品国产福利在线| 国产精品夜夜爽| 777奇米成人网| 国产精品免费看一区二区三区| 成人不用播放器| 蜜臀久久99精品久久久画质超高清 | 成年人网站免费视频| 杨幂毛片午夜性生毛片 | 波多野结衣在线观看一区二区三区 | 亚洲欧美日韩成人高清在线一区| 欧美国产极速在线|