回答
在我们调用 ConcurrentHashMap
的 put()
时,ConcurrentHashMap
会校验 key 和 value 是否为 null,如果为 null 就抛出 NullPointerException,如下:
为什么要这么设计呢?大明哥认为主要有如何几个原因。
一、避免多线程下的二义性
null
是一个特殊的值,表示没有对象或者引用。在 ConcurrentHashMap
中如果 key 或者 value 为 null,当我们通过 get(key)
获取对应的 value的时候,如果返回的结果是 null
,我们是没有办法判断的,它是 put(k,v)
的时候,value 本身为 null 值,还是这个 key 本身就不存在呢?
在并发编程中,一致性和可预测性非常重要。如果一个线程试图通过 get(key)
获取 key 的值时,而这个 key 尚未被任何线程写入,那它应该返回什么呢?
如果返回null
,那么这个返回值是表示 key 不存在,还是 key 的值就是null
?这样的歧义会使得并发编程更加复杂且容易出错。
那有小伙伴就说为什么 HashMap
允许为 key 和 value 为 null 呢?因为 HashMap
是并发不安全的呀,它不需要保证一致性和可预测性。
二、简化内容设计
ConcurrentHashMap
使用 CAS 来保证高效的并发能力,如果允许 null
作为 key
,会使得 ConcurrentHashMap
操作更加复杂,因为为了避免出现空指针,ConcurrentHashMap
中的大多数操作都需要额外检查null
,并做适当的处理。通过禁止null
,可以简化这些实现,降低错误的风险,同时提高整体性能。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。