为什么 ConcurrentHashMap 中 key 不允许为 null

这篇具有很好参考价值的文章主要介绍了为什么 ConcurrentHashMap 中 key 不允许为 null。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ConcurrentHashMap

在ConcurrentHashMap 的源码,在 put 方法里面,可以看到这样一段代码,如果 key 或者 value 为空,则抛出空指针异常。
为什么 ConcurrentHashMap 中 key 不允许为 null,java面试题,java,开发语言

但是为什么 ConcurrentHashMap 不允许 key 或者 value 为空呢? 文章来源地址https://www.toymoban.com/news/detail-724059.html

原因

简单来说,就是为了避免在多线程环境下出现歧义问题。所谓歧义问题,就是如果 key 或者 value 为 null,当我们通过 get(key)获取对应的 value的时候,如果返回的结果是 null我们没办法判断,它是 put(k,v)的时候,value 本身为 null 值,还是这个 key 本身就不存在。比如在这样一种情况下(如图),线程 t1 调用 containsKey 方法判断 key 是否存在,假设当前这个 key 不存在,本来应该返回 false。但是在 T1 线程返回之前,正好有一个 T2 线程插入了这个 key,但是 value 为null。这就导致原本 T1 线程返回的结果有可能是 true,有可能是 false,取决于 T1 和 T2 线程的执行顺序。
为什么 ConcurrentHashMap 中 key 不允许为 null,java面试题,java,开发语言

总结

这种现象我们可以认为是线程安全性问题,而 ConcurrentHashMap 又是一个线程安全的集合,
所以自然就不允许 key 或者 value 为 null。而 HashMap 中是允许存 null 的,因为它不需要考虑到线程安全性问题。所以这个问题的核心本质还是 ConcurrentHashMap 这个并发安全性集合的特性。当然。Doug Lea 还认为,不管是否是并发安全的集合,它都不应该允许存储 null。

到了这里,关于为什么 ConcurrentHashMap 中 key 不允许为 null的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原型链的终点为什么是null?

    一般来说,大家讲到原型链的时候到最后都会说: 所有的对象都是由Object构造函数所构造的,所以原型链的终点是Object.prototype. 而看过原型链完整图的应该都有印象,实际上真要讲终点的 话,其实原 型链的终点是- null    !  !   ! 于是我们思考下面这个问题 那这样是不是就陷入了

    2024年02月10日
    浏览(70)
  • 为什么数据库要允许没有主键的表存在

    在数据库设计中,主键是一个关键概念,用于唯一标识数据库表中的每一行数据。然而,有时候数据库允许没有主键的表存在的情况,这可能会引起一些争议和疑问。本文将探讨为什么数据库允许没有主键的表以及相关的考虑因素。 主键在数据库中具有以下作用: 唯一标识

    2024年02月08日
    浏览(68)
  • mysql的主键索引为什么不能null

    这是一个非常奇怪且有趣的问题。可以通过官方文档进行解读 https://dev.mysql.com/doc/refman/5.7/en/glossary.html A special value in SQL, indicating the absence of data. Any arithmetic operation or equality test involving a NULL value, in turn produces a NULL result. (Thus it is similar to the IEEE floating-point concept of NaN, “not

    2024年02月14日
    浏览(75)
  • 有了NULL,为什么C++还需要nullptr?

    目录 1.引言 2.类型安全 3.函数重载 4.代码清晰性 5.示例 6.总结 在C++编程中,nullptr是一个类型安全的空指针常量,自C++11起被引入。然而,在此之前,程序员们通常使用NULL或0来表示空指针。那么,为什么有了NULL之后,C++还需要引入nullptr呢?本文将从类型安全、函数重载和代

    2024年02月21日
    浏览(51)
  • 0062__对象指针为NULL,为什么还是可以调用成员函数

    对象指针为NULL,为什么还是可以调用成员函数_空对象指针为什么能调用函数_一颗石头崽儿的博客-CSDN博客

    2024年02月10日
    浏览(46)
  • 为什么除了null外,任何元素不得添加到上<? extends T>

    使用泛型类型参数限定为 ? extends T 时,我们无法确定实际类型参数是什么。这意味着我们只能安全地读取该类型的数据,但不能写入除了 null 以外的任何元素。 下面是一个示例代码,说明为什么无法向 ? extends T 类型的集合中添加任何元素: 在上面的示例中,我们有一个 i

    2024年02月12日
    浏览(41)
  • 【走进Java框架】什么是Java框架,为什么要学习Java框架.

    前言: 大家好,我是 良辰丫 ,今天我们就要开始Java框架之旅了,我们在学习的征途中不断充实自己,提升自己的能力,加油哈,自我勉励一下,跟随我的步伐,一起前行哈.💌💌💌 🧑个人主页:良辰针不戳 📖所属专栏:javaEE进阶篇之框架学习 🍎励志语句:生活也许会让我们遍体鳞

    2024年02月07日
    浏览(43)
  • 为什么Java不支持多继承

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏: MySQL学习 🥭本文内容:为什么Java不支持多继承 📚个人知识库: Leo知识库,欢迎大家访问 Java不支持多继承的主要

    2024年04月13日
    浏览(39)
  • Java中有了equals(),为什么还有“==“

    背景:Java中“一切皆是对象”,为什么还有非对象的“==”? 在Java语言假设我们只进行OOP,所以Java代码都是由一个接着一个的类组成的。那么,对象之间比较,用equals()就可以了。 可为什么“==”在代码随处可见呢? Java是基于C++的,相比与C++,Java是一种更“纯粹”的面向

    2023年04月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包