先假定ConcurrentHashMap也可以存放value為null的值。那不管是HashMap還是ConcurrentHashMap調用map.get(key)的時候,如果返回了null,那么這個null,都有兩重含義:
**1.這個key從來沒有在map中映射過。
**2.這個key的value在設置的時候,就是null。
在非線程安全的map集合(HashMap)中可以使用map.contains(key)方法來判斷,而ConcurrentHashMap卻不可以。
hashmap正確使用場景是單線程下,
由於是單線程,當得到的value是null的時候,可以用hashMap.containsKey(key)方法來區分上面說的兩重含義(保證在單線程下 線程安全 不存在並發場景,所以不會存在二義性)。
但是如果是ConcurrentHashMap呢?
它的使用場景是多線程的情況下。假設concurrentHashMap允許存放值為null的value。
這時有A、B兩個線程。
線程A調用concurrentHashMap.get(key)方法,返回為null,我們還是不知道這個null是沒有映射的null還是存的值就是null。
我們假設此時返回為null的真實情況就是因為這個key沒有在map里面映射過。那么我們可以用concurrentHashMap.containsKey(key)來驗證我們的假設是否成立,我們期望的結果是返回false。
但是在我們調用concurrentHashMap.get(key)方法之后,containsKey方法之前,有一個線程B執行了concurrentHashMap.put(key,null)的操作。那么我們調用containsKey方法返回的就是true了。這就與我們的假設的真實情況不符合了。
總結:在map容器里面,調用map.get(key)方法得到的值是null,那你無法判斷這個key是在map里面沒有映射過,還是這個key在map里面根本就不存在。這種情況下,在非並發安全的map中,你可以通過map.contains(key)的方法來判斷。但是在考慮並發安全的map中,在兩次調用的過程中,這個值是有可能被改變的。