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为null
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put(null,null);
hashMap.put("zhangsan",null);
System.out.println(hashMap);
//多个key为null
HashMap<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为null
Hashtable<String, String> table = new Hashtable<String, String>();
table.put(null,"111");
System.out.println(table);
//value为null
Hashtable<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为null
concurrentMap.put(null,"111");
System.out.println(concurrentMap);
ConcurrentMap<String, String> concurrentMap2 = new ConcurrentHashMap<>();
//key为null
concurrentMap2.put("zhangsan",null);
System.out.println(concurrentMap2);
key为null
value为null
原理