之前面试的时候有问过map中的key和value值是否能为空的问题,我当时想,value为空还有可能,那key还能为空吗?key为空那还有什么意义呢,但事实不是这样。至于部分map的key为什么能为空,可以再深入思考。
Map | Key | Value | Super | JDK | DESC |
HashTable | 不允许为null | 不允许为null | Dictionary | 1.0 | 线程安全(过时) |
ConCurrentHshMap | 不允许为null | 不允许为null | AbstractMap | 1.5 | 锁分段技术或CAS(JDK8以上) |
TreeMap | 不允许为null | 允许为null | AbstractMap | 1.2 | 线程不安全(有序) |
HashMap | 允许为null | 允许为null | AbstractMap | 1.2 | 线程不安全(resize死链问题) |
注:虽然部分map的key值是可以置入null,但实际开发中,很大几率会在调用过程中报异常,在线程中,子线程异常不会抛给主线程,因此在排查问题时会很繁琐,值得注意。