concurrentHasMap为什么不允许kv为null
1 concurrentHasMap为什么不允许kv为null
当 null 被允许作为键时,可能会引发一些歧义。在多线程环境下,查询某个键的值时,如果该键不存在,它通常返回 null。但如果允许 null 作为键,那么你无法区分:
键不存在:返回 null
键存在且值为 null:返回 null
2 在hashMap的区分方法:
使用 containsKey(key) 方法 containsKey(key) 方法用于检查 Map 中是否存在给定的键。如果返回 true,则表示该键存在,否则表示该键不存在。因此,可以通过 containsKey 来区分是键不存在还是键存在但值为 null。
3 为什么concurrentHashMap不能通过containsKey判断1中的两种情况?
3.1 如果 ConcurrentHashMap 允许存放 null 值
ConcurrentHashMap 是线程安全的容器,如果 ConcurrentHashMap 允许存放 null 值,那么当一个线程调用 get(key) 方法时,返回 null 可能有两种情况:
(1) 一种是这个 key 不存在于 map 中
(2) 另一种是这个 key 存在于 map 中,但是它的值为 null。
这样就会导致线程无法判断这个 null 是什么意思。
在非并发的场景下,可以通过 map.containsKey(key)检查是否包括该 key,从而断定是不存在 key 还是存在key 但值为 null,但是在并发场景下,判断后调用其他 api 之间 map 的数据已经发生了变化,无法保证对同一个 key 操作的一致性。
3.2 如果ConcurrentHashMap不允许存放 null 值和null键
在并发情况下,因为不允许将value置为null,只能remove,那么get(key)只要返回null就一定说明这个键不存在,而不是“键存在但value为null”。