首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么ConcurrentHashMap会阻止空键和值?

在回答这个问题之前,我们首先需要了解什么是 ConcurrentHashMap 以及它的作用。ConcurrentHashMap 是一种高性能的、线程安全的哈希表类,允许多个线程同时进行读写操作。在 ConcurrentHashMap 中,为了提高性能,在插入、删除和更新元素时,会使用一种称为“锁分离”的技术,将操作分解成多个步骤,每个步骤使用不同的锁来保护数据,从而减少锁竞争,提高并发性能。

接下来,我们来看一下 ConcurrentHashMap 为什么会阻止空键和值。实际上,ConcurrentHashMap 中的空键和值会引发异常,因为空键和值没有相应的键值对,无法进行插入、删除和更新操作。因此,在 ConcurrentHashMap 中,空键和值被作为一种特殊情况进行处理,以减少不必要的竞争,提高并发性能。

具体来说,当 ConcurrentHashMap 在插入、删除和更新元素时,如果遇到空键或空值,则会先进行一种称为“自旋”的操作,即线程会在循环中不断尝试插入、删除和更新元素,直到插入、删除和更新成功为止。在自旋过程中,如果插入、删除和更新操作失败,则会回滚操作,并尝试再次执行,直到操作成功为止。

需要注意的是,由于空键和值没有相应的键值对,因此在 ConcurrentHashMap 中插入、删除和更新元素时,需要先进行键值对的初始化操作,才能进行插入、删除和更新操作。初始化操作通常是在调用 put() 或 putAll() 方法时进行的,会在键值对中加入一个特殊的值,表示该键值对尚未初始化。在初始化之后,就可以进行正常的插入、删除和更新操作了。

总之,ConcurrentHashMap 会阻止空键和值,是因为空键和值没有相应的键值对,无法进行插入、删除和更新操作。在插入、删除和更新元素时,如果遇到空键或空值,则会先进行自旋操作,尝试插入、删除和更新元素,如果失败则会回滚操作,并尝试再次执行,直到操作成功为止。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 泪崩,中厂一面也要输了。。。

    HashMap 底层实现 在 JDK 1.7 版本之前, HashMap 数据结构是数组链表,HashMap通过哈希算法将元素的(Key)映射到数组中的槽位(Bucket)。...如果多个映射到同一个槽位,它们以链表的形式存储在同一个槽位上,因为链表的查询时间是O(n),所以冲突很严重,一个索引上的链表非常长,效率就很低了。...CASsychronized分别用于ConcurrentHashMap什么场景?...如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手为什么无法阻止历史连接呢?...两次握手造成资源浪费 即两次握手造成消息滞留情况下,服务端重复接受无用的连接请求 SYN 报文,而造成重复分配资源。 为什么断开连接是四次挥手?

    15410

    深入Go:sync.Map

    随着了解的深入,我们又有了疑惑:为什么不像Java SE 8之前的ConcurrentHashMap一样,使用分段锁?为什么在内部需要一个哨兵指针expunged?...(nil的处理我们后面会详细讨论,这也是sync.Map的highlight) read中包含的可不加锁地读删(不是删除对应,而是将entry.p = nil以表示对应被删除了) 除了一种特殊情况外...,更新read中已经存在的也无需加锁,该特殊情况在后文详细讲到 对dirty的读写删除都需要加锁,当dirty中包含read中没有的键值时(read.amended = true),...两个问题的回答 为什么不像Java SE 8之前的ConcurrentHashMap一样,使用分段锁?...为了弄清楚为什么使用expunged,我们需要知道: 指针在什么时候变为expunged的 为什么不仅仅使用nil 第一点,通过阅读代码我们知道,一个entry的p变为expunged当且仅当在加锁后

    1.4K30

    面试:HashMap 夺命二十一问!你都能 回答出来吗?

    这种变化带来什么问题? 7.HashMap中put方法的过程? 8.数组扩容的过程? 9.拉链法导致的链表过深问题为什么不用二叉查找树代替,而选择红黑树?为什么不一直使用红黑树?...为什么要重写 hashcode equals 方法?推荐看下。 4.你知道 hash 的实现吗?为什么要这样实现?...5.为什么要用异或运算符? 保证了对象的 hashCode 的 32 位只要有一位发生改变,整个 hash() 返回就会改变。尽可能的减少碰撞。...HashMap:在 Map 中插入、删除定位元素时; TreeMap:在需要按自然顺序或自定义顺序遍历的情况下; LinkedHashMap:在需要输出的顺序输入的顺序相同的情况下。...17.为什么 ConcurrentHashMap 比 HashTable 效率要高?

    69700

    HashMap?面试?我是谁?我在哪?

    当我们给 put() 方法传递时,我们先对调用 hashCode() 方法,计算并返回的 hashCode 是用于找到 Map 数组的 bucket 位置来储存 Node 对象。...这里关键点在于指出,HashMap 是在 bucket 中储存对象对象,作为Map.Node 。...为什么 String、Integer 这样的 wrapper 类适合作为? 因为 String 是 final,而且已经重写了 equals() hashCode() 方法了。...为什么不一直使用红黑树? 之所以选择红黑树是为了解决二叉查找树的缺陷:二叉查找树在特殊情况下变成一条线性结构(这就跟原来使用链表结构一样了,造成层次很深的问题),遍历查找非常慢。...为什么多线程导致死循环,它是怎么发生的? HashMap 的容量是有限的。当经过多次元素插入,使得 HashMap 达到一定饱和度时,Key 映射位置发生冲突的几率逐渐提高。

    76410

    HashMap的31连环炮,我倒在第5个上

    26:HashMap ConcurrentHashMap 的区别? 27:为什么 ConcurrentHashMap 比 HashTable 效率要高?...当我们给put()方法传递时,先对做一个hashCode()的计算来得到它在bucket数组中的位置来存储Entry对象。...1、再哈希法:如果hash出的index已经有,就再hash,不行继续hash,直至找到的index位置,要相信瞎猫总能碰上死耗子。这个办法最容易想到。但有2个缺点: 比较浪费空间,消耗效率。...不是,在多线程环境下,1.7 产生死循环、数据丢失、数据覆盖的问题,1.8 中会有数据覆盖的问题,以 1.8 为例,当 A 线程判断 index 位置为后正好挂起,B 线程开始往 index 位置的写入节点数据...27、为什么 ConcurrentHashMap 比 HashTable 效率要高?

    51020

    终结HashMap面试?我是谁?我在哪

    当我们给 put() 方法传递时,我们先对调用 hashCode() 方法,计算并返回的 hashCode 是用于找到 Map 数组的 bucket 位置来储存 Node 对象。...这里关键点在于指出,HashMap 是在 bucket 中储存对象对象,作为Map.Node 。 ?...为什么 String、Integer 这样的 wrapper 类适合作为? 因为 String 是 final,而且已经重写了 equals() hashCode() 方法了。...为什么不一直使用红黑树? 之所以选择红黑树是为了解决二叉查找树的缺陷:二叉查找树在特殊情况下变成一条线性结构(这就跟原来使用链表结构一样了,造成层次很深的问题),遍历查找非常慢。...为什么多线程导致死循环,它是怎么发生的? HashMap 的容量是有限的。当经过多次元素插入,使得 HashMap 达到一定饱和度时,Key 映射位置发生冲突的几率逐渐提高。

    52510

    一文带你网罗HashMap面试考点!

    当我们给put()方法传递时,我们先对调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。...这里关键点在于指出,HashMap是在bucket中储存对象对象,作为Map.Node 。 ?...为什么String, Interger这样的wrapper类适合作为?因为String是final的,而且已经重写了equals()hashCode()方法了。...为什么不一直使用红黑树? 之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找非常慢。...(多线程的环境下不使用HashMap) 为什么多线程导致死循环,它是怎么发生的? HashMap的容量是有限的。

    1K30

    你不知道 ConcurrentHashMap 的 kv 不能为 null?

    一、背景 最近设计某个类库时使用了 ConcurrentHashMap 最后遇到了 value 为 null 时报了指针异常的坑。...(2)为什么 ConcurrentHashMap 不支持 key value 为 null? (3)如果 value 可能为 null ,该如何处理?...可知 ConcurrentHashMap 是线程安全的容器,如果 ConcurrentHashMap 允许存放 null ,那么当一个线程调用 get(key) 方法时,返回 null 可能有两种情况...是否需要保证的顺序:如果需要按照的自然顺序或者插入顺序遍历 Map,那么应该使用 TreeMap或者 LinkedHashMap,它们都是有序的。...而 TreeMap ConcurrentSkipListMap则是基于平衡树实现的,具有较低的性能。CopyOnWriteMap 则是基于数组实现的,并发写操作复制整个数组,因此写操作开销很大。

    47820

    Java集合:ConcurrentHashMap

    在 HashTable 中,是直接在 put get 方法上加上了 synchronized,理论上来说 ConcurrentHashMap 也可以这么做,但是这么做锁的粒度太大,非常影响并发性能...V get(Object key):返回指定所映射到的,如果此映射不包含该的映射关系,则返回 null。 boolean isEmpty():如果此映射不包含-映射关系,则返回 true。...V putIfAbsent(K key, V value):如果指定已经不再与某个相关联,则将它与给定关联。 V remove(Object key):从此映射中移除(及其相应的)。...V replace(K key, V value):只有目前将的条目映射到某一时,才替换该的条目。...这就 2、为什么 key value 不允许为 null 在 HashMap 中,key value 都是可以为 null 的,但是在 ConcurrentHashMap 中却不允许,这是为什么

    62720

    HashMap?面试?我是谁?我在哪

    当我们给 put() 方法传递时,我们先对调用 hashCode() 方法,计算并返回的 hashCode 是用于找到 Map 数组的 bucket 位置来储存 Node 对象。...这里关键点在于指出,HashMap 是在 bucket 中储存对象对象,作为Map.Node 。 ?...为什么 String、Integer 这样的 wrapper 类适合作为? 因为 String 是 final,而且已经重写了 equals() hashCode() 方法了。...为什么不一直使用红黑树? 之所以选择红黑树是为了解决二叉查找树的缺陷:二叉查找树在特殊情况下变成一条线性结构(这就跟原来使用链表结构一样了,造成层次很深的问题),遍历查找非常慢。...为什么多线程导致死循环,它是怎么发生的? HashMap 的容量是有限的。当经过多次元素插入,使得 HashMap 达到一定饱和度时,Key 映射位置发生冲突的几率逐渐提高。

    40740

    这21个刁钻的HashMap面试题,我把阿里面试官吊打了

    * loadfactor 时,容器进行扩容resize 为 2n); ③、i.如果 K 的 hash 在 HashMap 中不存在,则执行插入,若存在,则发生碰撞; ii.如果 K 的 hash...5.为什么要用异或运算符? 保证了对象的 hashCode 的 32 位只要有一位发生改变,整个 hash() 返回就会改变。尽可能的减少碰撞。...HashMap:在 Map 中插入、删除定位元素时; TreeMap:在需要按自然顺序或自定义顺序遍历的情况下; LinkedHashMap:在需要输出的顺序输入的顺序相同的情况下。...17.为什么 ConcurrentHashMap 比 HashTable 效率要高?...③、在大量的数据操作下,对于 JVM 的内存压力,基于 API 的 ReentrantLock 开销更多的内存。 20.ConcurrentHashMap 简单介绍?

    2.4K21

    HashMap?面试?我是谁?我在哪

    当我们给put()方法传递时,我们先对调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。...这里关键点在于指出,HashMap是在bucket中储存对象对象,作为Map.Node 。 ?...为什么String, Interger这样的wrapper类适合作为?因为String是final的,而且已经重写了equals()hashCode()方法了。...为什么不一直使用红黑树? 之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找非常慢。...(多线程的环境下不使用HashMap) 为什么多线程导致死循环,它是怎么发生的? HashMap的容量是有限的。

    58330
    领券