問題描述
HashMap中的key-value可以是null,為什麼HashTable和ConcurrentHashMap中的不可以是null呢?
思考
這個問題還要從HashMap和HashTable的區別來說,HashTable內的方法是同步的,而HashMap不是;
所以一般來講,HashMap不是線程安全的,一般只用於單線程中;而HashTable則往往用於多線程中;
在允許key - value為null的情況下,考慮下面一個場景:
map.get(key) 的返回結果是null,那麼是因為不存在對應的key是null呢,還是key對應的value就是null;
對於單線程來講,這個問題是可以解決的,通過map.contains(key)就可以判斷,但是對於多線程來講,要解決這個問題就很複雜了,必須由外部保證contains 與 get操作的原子性,正是出於對這個問題考慮,所以不允許value為null;(實際上HashTable中並沒有提供contains方法,也是因為這個原因)
那麼為什麼key也不能是null呢?
由於null不是對象,因此不能在其上調用.equals()或.hashCode(),因此Hashtable無法將其計算哈希值以用作鍵。但是HashMap對此做了特殊處理;
小結
HashTable是很早的一個類了,JDK已經並不推薦使用;
在併發場景下,更建議使用ConcrrentHashMap
閱讀更多 IT技術百貨 的文章