问题描述
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