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 HashTable ConcurrentMap 中key value是否可以为null_多线程

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

原理

put方法

HashMap HashTable ConcurrentMap 中key value是否可以为null_存储数据_02

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

get方法

HashMap HashTable ConcurrentMap 中key value是否可以为null_多线程_04

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

HashMap HashTable ConcurrentMap 中key value是否可以为null_多线程_05

以至于我们在多线程情况下,使用的是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

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

value为null

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

结论 hashtable key value都不能为null

原理

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

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

HashMap HashTable ConcurrentMap 中key value是否可以为null_多线程_09

value为null

HashMap HashTable ConcurrentMap 中key value是否可以为null_存储数据_10

原理

HashMap HashTable ConcurrentMap 中key value是否可以为null_存储数据_11