阿里面試:java中為什麼HashTable的K-V不能是null

問題描述

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


分享到:


相關文章: