日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

高德面試:為什么Map不能插入Null?

來源: 責編: 時間:2024-06-06 17:43:21 229觀看
導讀在 Java 中,Map 是屬于 java.util 包下的一個接口(interface),所以說“為什么 Map 不能插入 null?”這個問題本身問的不嚴謹。Map 部分類關系圖如下:所以,這里面試官其實想問的是:為什么 ConcurrentHashMap 不能插入 null?1.Ha

UVT28資訊網——每日最新資訊28at.com

在 Java 中,Map 是屬于 java.util 包下的一個接口(interface),所以說“為什么 Map 不能插入 null?”這個問題本身問的不嚴謹。Map 部分類關系圖如下:UVT28資訊網——每日最新資訊28at.com

UVT28資訊網——每日最新資訊28at.com

所以,這里面試官其實想問的是:為什么 ConcurrentHashMap 不能插入 null?UVT28資訊網——每日最新資訊28at.com

1.HashMap和ConcurrentHashMap的區別

HashMap 和 ConcurrentHashMap 在對待 null 的態度上是不同的,在 Java 中,HashMap 是允許 key 和 value 值都為 null 的,如下代碼所示:UVT28資訊網——每日最新資訊28at.com

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

以上程序的執行結果如下:UVT28資訊網——每日最新資訊28at.com

存在 nullUVT28資訊網——每日最新資訊28at.com

從上述結果可以看出,HashMap 是允許  key 和 value 值都為 null 的。UVT28資訊網——每日最新資訊28at.com

但 ConcurrentHashMap 就不同了,它不但 key 不能為 null,而且 value 也不能為 null,如以下代碼所示:UVT28資訊網——每日最新資訊28at.com

ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap();concurrentHashMap.put(null, "javacn.site");System.out.println(concurrentHashMap.get(null));

在運行以上程序時就會報錯,如下圖所示:UVT28資訊網——每日最新資訊28at.com

UVT28資訊網——每日最新資訊28at.com

當然,當你為 ConcurrentHashMap 的 value 值設置 null 時也會報錯,如下代碼所示:UVT28資訊網——每日最新資訊28at.com

String key = "www.avacn.site";ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap();concurrentHashMap.put(key, null);System.out.println(concurrentHashMap.get(key));

在運行以上程序時就會報錯,如下圖所示:UVT28資訊網——每日最新資訊28at.com

UVT28資訊網——每日最新資訊28at.com

因此,我們可以得出結論:UVT28資訊網——每日最新資訊28at.com

  • 在 HashMap 中,key 和 value 值都可以為 null。
  • 在 ConcurrentHashMap 中,key 或者是 value 值都不能為 null。

2.為什么不能插入null?

如果我們查看 ConcurrentHashMap 的源碼,就能發現為什么 ConcurrentHashMap 不能插入 null 了,以下是 ConcurrentHashMap 添加元素時的部分核心源碼:UVT28資訊網——每日最新資訊28at.com

// 添加 key 和 valuepublic V put(K key, V value) {    return putVal(key, value, false);}final V putVal(K key, V value, boolean onlyIfAbsent) {    // 如果 key 或 value 為 null 的話直接拋出空指針異常    if (key == null || value == null) throw new NullPointerException();    int hash = spread(key.hashCode());    int binCount = 0;    // 忽略其他代碼......}

從上述 ConcurrentHashMap 添加元素的第一行源碼就可以看出,當 key 或 value 為 null 時,會直接拋出空指針異常,這就是 ConcurrentHashMap 之所以不能插入 null 的根本原因了,因為源碼就是這樣設計的。UVT28資訊網——每日最新資訊28at.com

3.更深層次的原因

那么問題來了,為什么 ConcurrentHashMap 的實現源碼中,不允許為 key 或者是 value 設置 null 呢?UVT28資訊網——每日最新資訊28at.com

這就要從 ConcurrentHashMap 的使用場景說起了,在 Java 中,ConcurrentHashMap 是用于并發環境中執行的線程安全的容器,而 HashMap 是用于單線程環境下執行的非線程安全的容器,而并發環境下的運行更復雜,如果我們允許 ConcurrentHashMap 的 key 或者是 value 為 null 的情況下,就會存在經典的“二義性問題”。UVT28資訊網——每日最新資訊28at.com

(1)什么是二義性問題?

所謂的二義性問題指的是代碼或表達式存在多種理解或解釋,導致程序的含義不明確或模糊。UVT28資訊網——每日最新資訊28at.com

以 ConcurrentHashMap 不允許為 null 的二義性問題來說,null 其實有以下兩層含義:UVT28資訊網——每日最新資訊28at.com

  • 這個值本身設置的是 null,null 在這里表示的是一種具體的“null”值狀態。
  • null 還表示“沒有”的意思,因為沒有設置,所以啥也沒有。

所以,如果 ConcurrentHashMap 允許插入 null 值,那么就會存在二義性問題。UVT28資訊網——每日最新資訊28at.com

那就有同學會問了,為什么 HashMap 允許插入 null,它就不怕有二義性問題嗎?UVT28資訊網——每日最新資訊28at.com

(2)可證偽的HashMap

HashMap 之所以不怕二義性問題的原因是,HashMap 的設計是給單線程使用的,而單線程下的二義性問題是能被證明真偽的,所以也就不存在二義性問題了(能被證明的問題就不是二義性問題)UVT28資訊網——每日最新資訊28at.com

例如,當我們給 HashMap 的 key 設置為 null 時,我們可以通過 hashMap.containsKey(key) 的方法來區分這個 null 值到底是存入的 null?還是壓根不存在的 null?這樣二義性問題就得到了解決,所以 HashMap 的二義性問題可被證明真偽,所以就不怕二義性問題,因此也就可以給 key 或者 value 設置 null 了。UVT28資訊網——每日最新資訊28at.com

(3)不可證偽的ConcurrentHashMap

而 ConcurrentHashMap 就不一樣了,因為 ConcurrentHashMap 是設計在多線程下使用的,而多線程下的二義性問題是不能被證明真偽的,所以二義性問題是真實存在的。UVT28資訊網——每日最新資訊28at.com

因為在你在證明二義性問題的同時,可能會有另一個線程影響你的執行結果,所以它的二義性問題就一直存在。UVT28資訊網——每日最新資訊28at.com

例如,當 ConcurrentHashMap 未設置 key 為 null 時,會有這樣一個場景,當一個線程 A 調用了 concurrentHashMap.containsKey(key),我們期望返回的結果是 false,但在我們調用 concurrentHashMap.containsKey(key) 之后,未返回結果之前,線程 B 又調用了 concurrentHashMap.put(key,null) 存入了 null 值,那么線程 A 最終返回的結果就是 true 了,這個結果和我們之前預想的 false 完全不一樣,這就是不能被證偽的二義性問題。UVT28資訊網——每日最新資訊28at.com

所以說,多線程的執行比較復雜,在多線程下 null 的二義性問題是不能被證明真偽的(因為在一個線程執行驗證時,可能會有另一個線程改動結果,造成結果不準確),所以 ConcurrentHashMap 為了避免這個二義性問題,所以就在源碼中禁用了 null 值作為 key 或 value。UVT28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-92476-0.html高德面試:為什么Map不能插入Null?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 轉轉回收業務策略中心的實踐

下一篇: 通過Spring Boot結合實時流媒體技術對考試過程進行實時監控

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久免费一区| 99在线视频精品| 国产麻豆视频精品| 国产欧美日本| 一区在线影院| 亚洲精品一区二区三区福利| 亚洲四色影视在线观看| 性色一区二区三区| 免费欧美视频| 国产精品国产三级国产专播精品人| 国产女人水真多18毛片18精品视频| 国内成+人亚洲| 亚洲精品一区二区三区樱花| 亚洲欧美日韩一区二区三区在线| 久久久久国产一区二区| 欧美人与禽猛交乱配视频| 国产精品永久免费观看| 亚洲国产欧美一区| 午夜精品久久久久| 欧美风情在线| 国产午夜精品视频| 99视频精品全部免费在线| 久久精品30| 欧美日韩调教| **性色生活片久久毛片| 亚洲午夜三级在线| 久久美女艺术照精彩视频福利播放| 欧美激情在线免费观看| 国产欧美在线视频| 9l国产精品久久久久麻豆| 久久久国产视频91| 欧美婷婷在线| 亚洲经典三级| 久久er精品视频| 欧美视频在线不卡| 亚洲高清自拍| 久久精品99久久香蕉国产色戒| 欧美日本韩国一区| 在线播放中文字幕一区| 午夜亚洲影视| 欧美日韩一区在线| 亚洲激情偷拍| 久久人人超碰| 国产亚洲精品高潮| 亚洲一区高清| 欧美日韩亚洲系列| 亚洲激情专区| 久久亚洲免费| 国产一区二区精品丝袜| 亚洲免费一在线| 欧美日韩黄色大片| 亚洲国产美女精品久久久久∴| 欧美在线播放一区| 国产精品免费观看视频| 一本色道久久综合亚洲精品按摩| 免费亚洲电影| 尤物视频一区二区| 久久成人一区二区| 国产欧美 在线欧美| 亚洲午夜久久久久久尤物| 欧美日韩精品在线视频| 亚洲经典自拍| 欧美sm重口味系列视频在线观看| 国产又爽又黄的激情精品视频| 亚洲欧美一区二区在线观看| 欧美视频在线观看一区| 夜夜夜精品看看| 欧美日韩视频不卡| 99国产一区| 欧美人与禽猛交乱配| 亚洲日本欧美在线| 欧美国产激情| 亚洲精品美女91| 欧美久久久久| 日韩一级裸体免费视频| 欧美日韩www| 洋洋av久久久久久久一区| 欧美激情亚洲一区| 亚洲精品专区| 欧美日韩国产综合网 | 欧美激情女人20p| 亚洲国产精品久久人人爱蜜臀| 久久在线免费| 在线不卡中文字幕| 久久艳片www.17c.com| 精品二区久久| 男女激情久久| 91久久亚洲| 欧美精品久久一区| 99视频精品在线| 国产精品白丝av嫩草影院| 亚洲永久免费观看| 国产精品一区=区| 欧美影院成年免费版| 国内精品视频在线观看| 久久夜色精品国产亚洲aⅴ| 在线免费一区三区| 欧美精品999| 亚洲一二三区精品| 国产日韩精品一区二区三区在线| 久久精品成人一区二区三区| 今天的高清视频免费播放成人 | 欧美国产日本| 夜久久久久久| 国产精品麻豆va在线播放| 午夜在线精品偷拍| 国产在线观看91精品一区| 老司机成人网| 99热免费精品在线观看| 国产精品视区| 久久理论片午夜琪琪电影网| 亚洲欧洲精品一区二区三区不卡 | 欧美a级理论片| 亚洲视频一区二区在线观看| 国产嫩草影院久久久久| 久久久蜜桃一区二区人| 亚洲欧洲日韩综合二区| 欧美三级日韩三级国产三级| 亚久久调教视频| 在线播放精品| 欧美日韩亚洲天堂| 欧美一区二区三区视频在线观看| 影视先锋久久| 欧美三级午夜理伦三级中文幕| 亚洲欧美影音先锋| 1024日韩| 国产精品欧美在线| 另类酷文…触手系列精品集v1小说| 亚洲精选中文字幕| 国产日产欧美精品| 欧美福利在线| 午夜精品一区二区三区在线视| 在线观看欧美黄色| 国产精品国产精品| 久久夜色撩人精品| 中文成人激情娱乐网| 一区二区三区无毛| 欧美日韩一区二区三区高清| 欧美伊人久久| 亚洲精品中文字幕在线观看| 国产伦精品一区二区三区视频黑人| 欧美α欧美αv大片| 亚洲欧美国产不卡| 亚洲欧洲一区二区天堂久久| 国产欧美一区二区三区沐欲| 欧美精品日韩精品| 久久精品人人| 亚洲午夜激情网页| 亚洲二区精品| 国产精品一国产精品k频道56| 欧美/亚洲一区| 欧美一区二区三区四区视频| 日韩一二在线观看| 在线看日韩av| 国产欧美一二三区| 欧美日韩亚洲视频一区| 乱人伦精品视频在线观看| 午夜精品在线视频| 在线视频精品一区| 亚洲激精日韩激精欧美精品| 国产亚洲视频在线| 国产精品99一区| 欧美高清一区二区| 久久久久久久一区二区| 亚洲欧美日韩成人高清在线一区| 亚洲精品美女91| 在线日韩电影| 国产亚洲一区在线播放| 国产精品久久久久久久久久免费| 欧美成人在线影院| 久久女同互慰一区二区三区| 亚洲天堂网在线观看| 亚洲欧洲综合| 樱花yy私人影院亚洲| 国产亚洲精品成人av久久ww| 国产精品视频精品| 国产精品扒开腿做爽爽爽软件| 欧美久久影院| 欧美二区在线观看| 免费日韩精品中文字幕视频在线| 久久精品中文字幕免费mv| 午夜久久影院| 亚洲一区二区成人| 正在播放亚洲一区| 一区二区三区福利| 999在线观看精品免费不卡网站| 亚洲国产乱码最新视频| 精品999久久久| 国内久久婷婷综合| 国产三区二区一区久久| 国产欧美精品在线观看| 国产精品日韩欧美大师| 国产精品激情电影| 国产精品久久久久久久久久免费 | 激情综合视频| 黄色影院成人| 黄色成人av网站| 国内外成人免费激情在线视频网站 | 亚洲精品久久久久| 亚洲精品欧美在线| 亚洲精品免费一二三区| 亚洲精品日韩精品| 日韩天堂av| 一区二区三区 在线观看视频|