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

面試突擊:為什么ConcurrentHashMap不允許插入null值?

開發 后端
在 Java 語言中,HashMap 這種單線程下使用的集合是可以設置 null 值的,而并發集合如 ConcurrentHashMap 或 Hashtable 是不允許給 key 或 value 設置 null 值的。

作者:磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯系授權(微信ID:GG_Stone)

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

null 值插入演示

首先給 HashMap 插入 null 值,實現代碼如下:


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

以上程序的執行結果如下:

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

編譯階段沒有報錯,執行以上程序,得到的結果如下:

從上述報錯信息可以看出,使用 ConcurrentHashMap 是不能插入 null 值的,否者程序在運行期間就會報空指針異常。

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

ConcurrentHashMap 源碼分析

為了尋找報錯的原因,我們嘗試打開 ConcurrentHashMap 的源碼一探究竟。打開 ConcurrentHashMap 添加元素的方法 put 實現源碼如下:

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

探索最終原因

通過上面源碼分析,我們似乎已經找到了 ConcurrentHashMap 不允許插入 null 值的原因,用一句話概括就是:烏龜的屁股“規定”!然而,這個原因是不能說服面試官的,雖然源碼是這樣設計的,但我們要思考的是,這樣設計背后更深層次的原因,為什么 ConcurrentHashMap 不允許插入 null?而 HashMap 又允許插入 null 呢?

二義性問題

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

值沒有在集合中,所以返回 null。

值就是 null,所以返回的就是它原本的 null 值。

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

可證偽的 HashMap

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

不可證偽的 ConcurrentHashMap

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

ConcurrentHashMap 設計者的回答

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

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 認為這樣設計最主要的原因是:不容忍在并發場景下出現歧義!

總結

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

參考文檔

cnblogs.com/fanguangdexiaoyuer/p/12335921.html

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-05-08 18:18:40

JDKValueHashMap

2023-08-22 20:43:09

HashMap單線程null

2022-01-24 07:01:20

安全多線程版本

2009-06-18 10:47:44

java接口定義變量

2024-06-06 08:10:30

多線程Mapnull

2024-09-03 09:45:36

2022-07-27 07:36:01

TCP可靠性

2021-08-23 12:54:12

開發技能代碼

2015-08-17 10:16:00

CentOSDocker命令root

2022-07-13 07:06:47

HTTPSHTTP協議

2022-09-20 22:27:08

事務失效public 修飾

2014-06-30 14:53:49

Android定制google

2020-08-20 11:12:14

iOS 13.6蘋果降級

2025-03-27 01:10:00

HashMap分段鎖CAS

2011-04-22 10:15:56

Novell專利

2022-07-25 07:07:35

TCP客戶端服務器

2010-11-02 15:08:40

設置db2主鍵

2010-06-01 16:12:00

2011-03-01 14:12:12

FreebsdProftpd

2022-01-18 06:59:50

HashMap循環底層
點贊
收藏

51CTO技術棧公眾號

久久精品亚洲一区| 91国产福利在线| 91精品国产一区二区三区蜜臀 | 一区二区三区四区不卡视频 | 国产精品欧美极品| 色偷偷综合社区| www污在线观看| 黄色精品视频| 国产最新精品精品你懂的| 亚洲第一福利网| 欧洲精品码一区二区三区免费看| 色的视频在线免费看| 美女露胸视频在线观看| 日本成人在线电影网| 亚洲乱码一区二区| 国产三级中文字幕| 亚州一区二区三区| 99re这里只有精品首页| 久久99国产精品自在自在app| 亚洲精品中文字幕无码蜜桃| 超碰地址久久| 亚洲一区二区在线视频| 国产欧美精品一区二区| 北岛玲一区二区三区| 毛片av一区二区三区| www.日韩.com| 精品99在线视频| 国产一区二区在线| 欧美日韩精品三区| 在线观看av的网址| 久久视频社区| 亚洲动漫第一页| 欧美高清性xxxxhdvideosex| **在线精品| 一区二区三区在线免费播放 | 欧美激情视频在线播放| 日本一不卡视频| 久久久av一区| 天堂在线第六区| 日本欧美韩国一区三区| 伦伦影院午夜日韩欧美限制| 最新二区三区av| 蜜臀国产一区二区三区在线播放 | 男女午夜激情视频| 中文字幕一区二区三区久久网站| 精品少妇一区二区三区在线视频 | 国产精品99久久99久久久二8| 美女国产在线| 国产精品美女久久久久久久久久久| 99影视tv| 日本免费一区二区视频| 精品视频免费在线| 操日韩av在线电影| 日韩美女爱爱视频| 欧美日韩 国产精品| 国产精品欧美一区二区三区奶水| 日韩欧美网址| 91网站免费看| 99精品99| 91免费国产精品| 久久免费美女视频| 男女小视频在线观看| 亚洲不卡在线观看| 二人午夜免费观看在线视频| 3d动漫精品啪啪一区二区竹菊 | 亚洲一区二区小说| 日韩一区在线视频| 动漫av一区| 日韩免费精品视频| 国产亚洲一区| 国产裸体写真av一区二区| 我不卡影院28| 国产美女精品在线观看| 亚洲一区二区三区免费在线观看| 日韩福利在线| 东方aⅴ免费观看久久av| www.国产在线视频| 国产精品人人做人人爽人人添| y4480在线8影院| 6080午夜不卡| 另类av导航| 成人久久视频在线观看| 久久久国产欧美| 狠狠躁夜夜躁久久躁别揉| 日本色护士高潮视频在线观看| 在线观看日韩专区| 国产精品免费99久久久| 国产精品一区二区三区免费视频| 爽成人777777婷婷| 青青草原成人| 91视频你懂的| 男女激情片在线观看| 欧美一区二区成人6969| 超碰这里只有精品| 91在线观看免费高清| 亚洲黄色成人| 91精品国产91久久久久麻豆 主演| 欧美高清一级片在线观看| 黄网站免费观看| 欧美日韩综合在线| 亚洲同志男男gay1069网站| 日韩视频免费在线| 无需播放器亚洲| 777久久精品一区二区三区无码 | 国产精品粉嫩| 国产精品ⅴa在线观看h| 久久精品久久综合| 在线看片你懂的| 久久久久久久电影一区| 国产一区二三区好的| 国产尤物视频在线| 日韩免费视频在线观看| 久久精品国产www456c0m| 欧美亚洲免费在线| 盗摄精品av一区二区三区| 久热精品在线播放| 欧美日韩中文字幕综合视频| 成人性生交大片免费看在线播放| 一道本无吗dⅴd在线播放一区| 无码国模国产在线观看| 91亚洲精品视频| 国内精品伊人久久久久av影院| 国产91大片| 精品国产一区二区三区不卡 | 日韩暖暖在线视频| 国产日韩一区二区三区在线| 人妻无码久久一区二区三区免费| 午夜精品在线看| 999精品网| 国产精品久久一区主播| 青青青伊人色综合久久| 成年免费网站| 欧美sm美女调教| 国产裸舞福利在线视频合集| 久久精品国产成人| 天堂va蜜桃一区二区三区 | 国产高清中文字幕在线| 国产欧美精品一区二区三区介绍| 国产成人精品免费在线| 精品av中文字幕在线毛片| 欧美国产视频日韩| 亚洲综合日本| 日韩伦理片在线观看| 国产一区二区三区18| 欧美1区视频| caoporen人人| 久久九九全国免费精品观看| 免费看黄裸体一级大秀欧美| 欧美日夜夜逼| 久久久久久久久久久人体| 成人午夜在线播放| 日韩成人伦理| 国产精品一区二区三区精品| 亚洲三级在线免费观看| 亚洲午夜免费| www.日本在线播放| 精品久久人人做人人爰| 欧美精品色网| 欧美激情第六页| 色悠悠久久综合| 欧美日韩激情| 九色porny在线观看| 欧美孕妇孕交黑巨大网站| 久久精品一区二区三区不卡牛牛 | 91精品国产黑色紧身裤美女| 无需播放器亚洲| 情趣视频网站在线免费观看| 欧美一级片在线播放| 国产女人18毛片水真多成人如厕 | 日本网站在线观看一区二区三区| 好男人免费精品视频| 99精彩视频| 欧美性猛交xxxx免费看| 牛牛国产精品| 国产天堂在线| 国产精品av一区| 欧美日韩精品一区二区在线播放| 日韩专区精品| 你懂得网站在线| 99九九视频| 欧美一区二区三区在| aa亚洲婷婷| 男人添女人下部高潮视频在线观看| 欧美福利一区二区三区| 精品一区精品二区| 成人网在线播放| 国产精品亚洲一区二区在线观看| 91猫先生在线| 高清在线视频日韩欧美| 亚洲天堂2014| 亚洲天堂偷拍| 欧美久久天堂| 亚洲国产精品毛片av不卡在线| 国自在线精品视频| 五月婷婷综合激情| 视频一区二区三区在线| xxxxx.日韩| 95影院理论片在线观看| 久久国产一区| 日韩中文字幕第一页|