写点什么

HashMap HashTable ConcurrentMap 中 key value 是否可以为 null

作者:javaNice
  • 2023-11-22
    四川
  • 本文字数:879 字

    阅读完需:约 3 分钟

HashMap HashTable ConcurrentMap 中 key value 是否可以为 null

先说结论


hashmap 的 key,value 都可以为 null;当 key 重复时,第二个 key 的 value 会覆盖第一个 key 的 value


HashTable 它的 key 和 value 都是不能为 null 的


ConcurrentMap 存储数据,它的 key 和 value 都是不能为 null 的

1.HashMap

//key为null value为nullHashMap<String,String> hashMap=new HashMap<>();hashMap.put(null,null);hashMap.put("zhangsan",null);System.out.println(hashMap);
//多个key为nullHashMap<String,String> hashMap2=new HashMap<>();hashMap2.put(null,"111");hashMap2.put(null,null);System.out.println(hashMap2);
复制代码


结论:hashmap 的 key,value 都可以为 null;当 key 重复时,第二个 key 的 value 会覆盖第一个 key 的 value

原理

put 方法




get 方法



返回的是 null,此时 null 值不知道是未找到还是对应的 value 值。这就出现了一个问题:当 A 线程使用 containsKey()进行判断时,发现有这个元素,当他调用 get()取这个元素时,B 线程加入了进来,B 线程将这个元素移除掉了,此时 A 线程取得的值为 null,A 线程会以为自己取到了这个值,但实际上此时的 null 是未找到的 null。这样线程间就有可能出现安全问题。



以至于我们在多线程情况下,使用的是 currentHashMap 存储数据,它的 key 和 value 都是不能为 null 的

2.HashTable

//key为nullHashtable<String, String> table = new Hashtable<String, String>();table.put(null,"111");System.out.println(table);
//value为nullHashtable<String, String> table2 = new Hashtable<String, String>();table2.put("zhangsan",null);System.out.println(table2);
复制代码


key 为 null



value 为 null


结论 hashtable key value 都不能为 null

原理

3.ConcurrentMap

ConcurrentMap<String, String> concurrentMap = new ConcurrentHashMap<>();//key为nullconcurrentMap.put(null,"111");System.out.println(concurrentMap);

ConcurrentMap<String, String> concurrentMap2 = new ConcurrentHashMap<>();//key为nullconcurrentMap2.put("zhangsan",null);System.out.println(concurrentMap2);
复制代码


key 为 null



value 为 null



原理



发布于: 刚刚阅读数: 4
用户头像

javaNice

关注

还未添加个人签名 2023-11-02 加入

还未添加个人简介

评论

发布
暂无评论
HashMap HashTable ConcurrentMap 中key value是否可以为null_Java_javaNice_InfoQ写作社区