HashMap中的key-value可以是null,为什么Hashtable和ConcurrentHashMap中的不可以是null呢?,今天小编就来聊一聊关于java 面试hashmap?接下来我们就一起去研究一下吧!

java 面试hashmap(java中为什么HashTable的K-V不能是null)

java 面试hashmap

问题描述

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

,