AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

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

xNM28資訊網(wǎng)——每日最新資訊28at.com

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

xNM28資訊網(wǎng)——每日最新資訊28at.com

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

1.HashMap和ConcurrentHashMap的區(qū)別

HashMap 和 ConcurrentHashMap 在對(duì)待 null 的態(tài)度上是不同的,在 Java 中,HashMap 是允許 key 和 value 值都為 null 的,如下代碼所示:xNM28資訊網(wǎng)——每日最新資訊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");}

以上程序的執(zhí)行結(jié)果如下:xNM28資訊網(wǎng)——每日最新資訊28at.com

存在 nullxNM28資訊網(wǎng)——每日最新資訊28at.com

從上述結(jié)果可以看出,HashMap 是允許  key 和 value 值都為 null 的。xNM28資訊網(wǎng)——每日最新資訊28at.com

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

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

在運(yùn)行以上程序時(shí)就會(huì)報(bào)錯(cuò),如下圖所示:xNM28資訊網(wǎng)——每日最新資訊28at.com

xNM28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,當(dāng)你為 ConcurrentHashMap 的 value 值設(shè)置 null 時(shí)也會(huì)報(bào)錯(cuò),如下代碼所示:xNM28資訊網(wǎng)——每日最新資訊28at.com

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

在運(yùn)行以上程序時(shí)就會(huì)報(bào)錯(cuò),如下圖所示:xNM28資訊網(wǎng)——每日最新資訊28at.com

xNM28資訊網(wǎng)——每日最新資訊28at.com

因此,我們可以得出結(jié)論:xNM28資訊網(wǎng)——每日最新資訊28at.com

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

2.為什么不能插入null?

如果我們查看 ConcurrentHashMap 的源碼,就能發(fā)現(xiàn)為什么 ConcurrentHashMap 不能插入 null 了,以下是 ConcurrentHashMap 添加元素時(shí)的部分核心源碼:xNM28資訊網(wǎng)——每日最新資訊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 添加元素的第一行源碼就可以看出,當(dāng) key 或 value 為 null 時(shí),會(huì)直接拋出空指針異常,這就是 ConcurrentHashMap 之所以不能插入 null 的根本原因了,因?yàn)樵创a就是這樣設(shè)計(jì)的。xNM28資訊網(wǎng)——每日最新資訊28at.com

3.更深層次的原因

那么問題來了,為什么 ConcurrentHashMap 的實(shí)現(xiàn)源碼中,不允許為 key 或者是 value 設(shè)置 null 呢?xNM28資訊網(wǎng)——每日最新資訊28at.com

這就要從 ConcurrentHashMap 的使用場(chǎng)景說起了,在 Java 中,ConcurrentHashMap 是用于并發(fā)環(huán)境中執(zhí)行的線程安全的容器,而 HashMap 是用于單線程環(huán)境下執(zhí)行的非線程安全的容器,而并發(fā)環(huán)境下的運(yùn)行更復(fù)雜,如果我們?cè)试S ConcurrentHashMap 的 key 或者是 value 為 null 的情況下,就會(huì)存在經(jīng)典的“二義性問題”。xNM28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

  • 這個(gè)值本身設(shè)置的是 null,null 在這里表示的是一種具體的“null”值狀態(tài)。
  • null 還表示“沒有”的意思,因?yàn)闆]有設(shè)置,所以啥也沒有。

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

那就有同學(xué)會(huì)問了,為什么 HashMap 允許插入 null,它就不怕有二義性問題嗎?xNM28資訊網(wǎng)——每日最新資訊28at.com

(2)可證偽的HashMap

HashMap 之所以不怕二義性問題的原因是,HashMap 的設(shè)計(jì)是給單線程使用的,而單線程下的二義性問題是能被證明真?zhèn)蔚模砸簿筒淮嬖诙x性問題了(能被證明的問題就不是二義性問題)。xNM28資訊網(wǎng)——每日最新資訊28at.com

例如,當(dāng)我們給 HashMap 的 key 設(shè)置為 null 時(shí),我們可以通過 hashMap.containsKey(key) 的方法來區(qū)分這個(gè) null 值到底是存入的 null?還是壓根不存在的 null?這樣二義性問題就得到了解決,所以 HashMap 的二義性問題可被證明真?zhèn)危跃筒慌露x性問題,因此也就可以給 key 或者 value 設(shè)置 null 了。xNM28資訊網(wǎng)——每日最新資訊28at.com

(3)不可證偽的ConcurrentHashMap

而 ConcurrentHashMap 就不一樣了,因?yàn)?ConcurrentHashMap 是設(shè)計(jì)在多線程下使用的,而多線程下的二義性問題是不能被證明真?zhèn)蔚模远x性問題是真實(shí)存在的。xNM28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)樵谀阍谧C明二義性問題的同時(shí),可能會(huì)有另一個(gè)線程影響你的執(zhí)行結(jié)果,所以它的二義性問題就一直存在。xNM28資訊網(wǎng)——每日最新資訊28at.com

例如,當(dāng) ConcurrentHashMap 未設(shè)置 key 為 null 時(shí),會(huì)有這樣一個(gè)場(chǎng)景,當(dāng)一個(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 完全不一樣,這就是不能被證偽的二義性問題。xNM28資訊網(wǎng)——每日最新資訊28at.com

所以說,多線程的執(zhí)行比較復(fù)雜,在多線程下 null 的二義性問題是不能被證明真?zhèn)蔚模ㄒ驗(yàn)樵谝粋€(gè)線程執(zhí)行驗(yàn)證時(shí),可能會(huì)有另一個(gè)線程改動(dòng)結(jié)果,造成結(jié)果不準(zhǔn)確),所以 ConcurrentHashMap 為了避免這個(gè)二義性問題,所以就在源碼中禁用了 null 值作為 key 或 value。xNM28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 轉(zhuǎn)轉(zhuǎn)回收業(yè)務(wù)策略中心的實(shí)踐

下一篇: 通過Spring Boot結(jié)合實(shí)時(shí)流媒體技術(shù)對(duì)考試過程進(jìn)行實(shí)時(shí)監(jiān)控

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 一加Ace2 Pro官宣:普及16G內(nèi)存 引領(lǐng)24G

    一加官方今天繼續(xù)為本月發(fā)布的新機(jī)一加Ace2 Pro帶來預(yù)熱,公布了內(nèi)存方面的信息?!疤蕴?8GB ,12GB 起步,16GB 普及,24GB 引領(lǐng),還有呢?#一加Ace2Pro#,2023 年 8 月,敬請(qǐng)期待?!蓖瑫r(shí)
  • 官方承諾:K60至尊版將會(huì)首批升級(jí)MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會(huì)搭載天璣9200+處理器和獨(dú)顯芯片X7的同時(shí),Redmi給出了官方承諾,K60至尊重大更新首批升級(jí),會(huì)首批推送MIUI 15。也就是說雖然
  • K60至尊版狂暴引擎2.0加持:超177萬跑分?jǐn)孬@性能第一

    Redmi的后性能時(shí)代戰(zhàn)略發(fā)布會(huì)今天下午如期舉辦,在本次發(fā)布會(huì)上,Redmi公布了多項(xiàng)關(guān)于和聯(lián)發(fā)科的深度合作,以及新機(jī)K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個(gè)監(jiān)控頁(yè)面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(chǔ)(消息堆積)、消費(fèi) 三大塊領(lǐng)域。那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。注意,如果白話中不小心提到相關(guān)代
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的&ldquo;頭騰
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級(jí)不香了。俗話說,兵無常勢(shì),水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級(jí)體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,目前已形成一
  • 郭明錤稱華為和江淮汽車合作開發(fā)問界MPV,定價(jià)100萬左右、計(jì)劃明年量產(chǎn)

    8 月 1 日消息,郭明錤今天在 Medium 平臺(tái)發(fā)布博文,稱華為正在和江淮汽車合作,開發(fā)售價(jià)在 100 萬元的問界 MPV,預(yù)計(jì)在 2024 年第 2 季度量產(chǎn),銷量目標(biāo)為
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據(jù)官方此前宣布,三星將于7月26日在韓國(guó)首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
Top