首页 > 其他分享 >为什么HashMap可以存null,而ConcurrentHashMap不可以?

为什么HashMap可以存null,而ConcurrentHashMap不可以?

时间:2023-05-30 11:23:03浏览次数:29  
标签:返回 map ConcurrentHashMap HashMap key null

HashMap中,null可以作为键也可以做为值。而在ConcurrentHashMap中,Key和Value都不允许为null。

ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用null值的主要原因是,在非并发的Map中(如HashMap),是可以容忍模糊性(二义性)的,而在并发Map中是无法容忍的。

假如说,所有的Map都支持null的话,那么map.get(key)就可以返回null,但是,这时候就会存在一个不确定性,当你拿到null的时候,你是不知道他是因为本来就存了一个null进去还是说就是因为没找到而返回了null。

在HashMap中,因为它的设计就是给单线程用的,所以当我们map.get(key)返回null的时候,我们是可以通过map.contains(key)检查来进行检测的,如果它返回true,则认为是存了一个null,否则就是因为没找到而返回了null。

但是,像ConcurrentHashMap,它是为并发而生的,它是要用在并发场景中的,当我们map.get(key)返回null的时候,是没办法通过通过map.contains(key)检查来准确的检测,因为在检测过程中可能会被其他线程锁修改,而导致检测结果并不可靠。

所以,为了让ConcurrentHashMap的语义更加准确,不存在二义性的问题,他就不支持null。

标签:返回,map,ConcurrentHashMap,HashMap,key,null
From: https://www.cnblogs.com/liuannan/p/17442718.html

相关文章

  • ConcurrentHashMap
    引言HashMap在我们日常的开发中使用频率最高的一个工具类之一,然而使用HashMap最大的问题之一就是它是线程不安全的,如果我们想要线程安全,这时候就可以选择使用ConcurrentHashMap,ConcurrentHashMap和HashMap的功能是基本一样的,ConcurrentHashMap是HashMap的线程安全版......
  • HashMap底层原理
    HashMap是Java中常用的数据结构之一,它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍:1.数据结构:HashMap底层使用数组和链表(或红黑树)的组合实现。它通过哈希算法将键转换为数组索引,并将值存储在对应索引位置上。2.哈希算法:当我们向HashMap中存储一个键值......
  • RollingFileAppender[FILE] - openFile(null,true) call failed. java.io.FileNotFoun
          2023-05-2916:25:31[main]ERRORo.s.boot.SpringApplication-Applicationrunfailedjava.lang.IllegalStateException:Logbackconfigurationerrordetected:ERRORinch.qos.logback.core.rolling.RollingFileAppender[FILE]-openFile(null,true)......
  • canal+rabbitmq: Could not convert incoming message with content-type [null]
    SpringBoot整合Canal+RabbitMQ实现监听MySQL数据库同步更新Redis缓存,编写RabbitMQ消费端监听同步缓存。接收消息是字符串返回的是字节数据,eg:-30,-128,-100,-25,-126,-71,-27,-81,-71,-25,-126,-71,-30,-128,-99使用了jackson的converter后,报了如下的异常:Causedby:......
  • hashmap怎么解决哈希冲突问题?红黑树和AVL树有何区别?
    链地址法hashmap是一种基于数组和链表(或红黑树)的数据结构,它可以通过hash函数将任意长度的键映射到一个固定长度的索引,从而实现快速的存取操作。但是,由于hash函数的结果是有限的,而键的数量是无限的,所以可能存在不同的键映射到同一个索引的情况,这就叫做哈希冲突。为了解决哈希冲突,has......
  • java中HashMap的实现原理
    HashMap是Java中常用的一种存储结构,它通过哈希表实现了快速查找数据的功能,下面是它的具体实现原理:HashMap内部存储结构HashMap的内部实现是一个数组和一个链表组成的。数组称为哈希表,用于保存实际存储的数据,链表则用于处理哈希冲突,即不同的键值对可能会被存储到哈希表的同一个位置......
  • 理解ConcurrentHashMap的多线程执行
    理解ConcurrentHashMap的多线程执行多线程下ConcurrentMap单个操作的顺序性/原子性结论:ConcurrentHashMap单个操作,例如get/put/remove都有原子性,即使操作同一个key,在底层会通过synchronized锁去排队执行。所以多线程下,任意的执行结果都是合理的。lab1:三个线程,操作同一个Concur......
  • 【异常】java: Internal error in the mapping processor: java.lang.NullPointerExce
    本文目录一、背景描述二、错误原因三、解决方案一、背景描述项目背景:IDEA(2020.3)+Springboot(2.1.5.RELEASE)+maven报错内容:java:Internalerrorinthemappingprocessor:java.lang.NullPointerException二、错误原因错误原因还没有找到三、解决方案在使用mapstruct,IDEA......
  • 千万级的数据用hashmap存储需要考虑哪些问题?
    答案:一般会预先初始化一个大容量的map解释hashmap默认初始化容量为16,在不断添加key-value时,使用率达到75%会触发扩容,此时hashmap容量会增大一倍,同时会进行key-value的拷贝及重新计算hash映射,当map中存储的key-value越来越多时扩容将导致内存溢出,所以要存储上百万或千万数据时一......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......