ConcurrentHashMap这么设计的原因是为了避免在多线程并发场景下的歧义问题。也就是说,当一个线程从ConcurrentHashMap获取某个key,如果返回的结果是null的时候。这个线程无法确认,这个null表示的是确实不存在这个key,还是说存在key,但是value为空。这种不确定性会造成线程安全性问题,而ConcurrentHashMap本身又是一个线...
前面分析ConcurrentHashMap的过程中可以发现,其要求key和value不能为空。实际上,不仅仅是ConcurrentHashMap,前面的HashTable,以及ConcurrentSkipListMap,这些并发的Map都不允许为空。在面试的过程中,不少大厂也会拿这个问题做为追问的问题之一。那么我们就来具体聊聊为什么不能为null的深层次的原因。 层次1:源码不支持 ...
在学习源码的时候,看到了concurrenthashmap中的value不能为空的情况,突然觉得很奇怪 publicVput(K key, V value){returnputVal(key, value,false); }/** Implementation for put and putIfAbsent */finalVputVal(K key, V value,booleanonlyIfAbsent){if(key ==null|| value ==null)thrownewNullPointerExcept...
ConcurrentHashMap在源码中加入不允许插入null(空)值的设计,主要目的是为了防止并发场景下的歧义问题。 也就是说,当一个线程从ConcurrentHashMap获取某个key,如果返回的结果是null的时候。 这个线程无法确认,这个null表示的是确实不存在这个key,还是说存在key,但是value为空。 这种不确定性会造成线程安全性问题,而Concu...
ConcurrentMap存储数据,它的key和value都是不能为null的 1.HashMap //key为null value为null HashMap<String,String> hashMap=new HashMap<>(); hashMap.put(null,null); hashMap.put("zhangsan",null); System.out.println(hashMap); //多个key为null ...
hashMap.keySet()的返回值是HashSet, HashSet的contains(key)方法,在取key的hash值时,会判断key是否为空,如果key为空,用0来代替key的哈希值。 concurrentHashMap.keySet()的返回值是KeySetView,KeySetView的contains(key)方法在取key的hash值时,不会判断key是否为空,如果key为空,就会抛出NPE。
key不能为空,无法解释,没有什么可说的,可能就是作者的想法。 value不能为空是因为ConcurrentHashMap是工作在多线程环境下的,如果调用get方法,返回null,这个时候就存在二义性,因为ConcurrentHashMap不知道是没有这个key,还是这个key对应的值是不是null。所以干脆不支持value为null。
可能没有test这个key 可能有test这个key,只不过value为null HashMap如何解决二义性问题 containsKey方法的结果一个为false一个为true,可以通过这个方法来区分上面说道的二义性问题 public boolean containsKey(Object key) { return getNode(hash(key), key) != null; ...
在 ConcurrentHashMap 中,key 和 value 都不能为 null。如果尝试插入 null 值,会抛出异常。例如:ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();concurrentHashMap.put(null, "javacn.site"); // 抛出异常 类似地,当 value 为 null 时,也会出现异常:String key = "...
在Java语言中,给ConcurrentHashMap和Hashtable这些线程安全的集合中的Key或者Value插入 null(空) 值的会报空指针异常,但是单线程操作的HashMap又允许 Key 或者 Value 插入 null(空) 值。这到底是为什么呢? 1、探寻源码 为了找到原因,我们先来看这样一段源码片段,打开ConcurrentHashMap的putVal()方法,源码中第一句就...