文章目录
- 背景
- Demo
- 总结
背景 之前工作中对代码进行重构,发现之前的全是用的HashMap,HashMap是线程不安全的,所以想到用ConcurrentHashMap,简单说是一个分段的HashTable,使得在加锁的基础上,效率默认提升了16倍。
可是用了ConcurrentHashMap后,原来不报错的地方突然报错了,晕~
具体代码就不贴图了,就是比较常见的空指针异常。
Demo
public class Test {
public static void main(String[] args) {
Map, String> hashMap = new HashMap, String>();
String s = hashMap.get(null);
System.out.println("HashMap get --- "+s);
hashMap.put(null, null);
System.out.println("HashMap put success !");
ConcurrentHashMap, String> concurrentHashMap = new ConcurrentHashMap, String>();
String s1 = concurrentHashMap.get(null);
System.out.println("ConcurrentHashMap---"+concurrentHashMap);
concurrentHashMap.put(null, null);
System.out.println("concurrentHashMap put success !");
}
}
文章图片
可以看到HashMap 支持 null key、null value , ConcurrentHashMap不支持 null key、null value 。
ConcurrentHashMap :
put方法,key/value 如果为null 直接抛出异常。
get方法,key没有判断null 会报空指针异常
总结 HashMap
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
ConcurrenHashMap
/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
if (key == null || value =https://www.it610.com/article/= null) throw new NullPointerException();
int hash = spread(key.hashCode());
int binCount = 0;
......
}
上面是源码层面,可是为什么这样设计?
ConcurrentHashmap HashMap和Hashtable都是key-value存储结构,但他们有一个不同点是 ConcurrentHashmap、Hashtable不支持key或者value为null,而HashMap是支持的。为什么会有这个区别?在设计上的目的是什么?
ConcurrentHashmap和Hashtable都是支持并发的,这样会有一个问题,当你通过get(k)获取对应的value时,如果获取到的是null时,你无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。HashMap是非并发的,可以通过contains(key)来做这个判断。而支持并发的Map在调用m.contains(key)和m.get(key),m可能已经不同了。
—https://www.cnblogs.com/heqiyoujing/p/10928334.html
【JAVA??|关于HashMap和ConcurrentHashMap NullPointerException的问题】ConcurrentHashMap不能put null 是因为 无法分辨是key没找到的null还是有key值为null,这在多线程里面是模糊不清的,所以压根就不让put null。
—https://blog.csdn.net/u013837825/article/details/87743520
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)