在日常开发中Map可能是Java集合框架中最常用的一个类了,当我们常规使用HashMap时可能会经常看到以下这种代码:
Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(user.getId,user.getUsername);
似乎看起来并没有什么问题,但当你用到多线程的场景时,HashMap
必然是线程不安全的,为了更高的支持高并发,JDK1.5以后Java提供了一个线程安全的HashMap
,即ConcurrentHashMap
,但这也在使用中提供了一个坑,它与HashMap
在使用上最浅显的不同是,前者不支持空字段存储,所以当你再使用一下代码去使用ConcurrentHashMap
时就容易抛出空指针异常,需要做的就是在进行put()
操作之前先对对象进行字段是否为空的判断。
在Map中关于K/V是否为空的说明如下
集合类 | Key | Value | Super | 说明 |
---|---|---|---|---|
Hashtable | 不允许为 null | 不允许为 null | Dictionary | 线程安全 |
ConcurrentHashMap | 不允许为 null | 不允许为 null | AbstractMap | 分段锁技术 |
TreeMap | 不允许为 null | 允许为 null | AbstractMap | 线程不安全 |
HashMap | 允许为 null | 允许为 null | AbstractMap | 线程不安全 |