图虫网站源码分享下载(图虫在线)

大家好,今天来为大家分享图虫网站源码分享下载的一些知识点,和图虫在线的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

作者|楼下小黑哥

头图|CSDN下载自图虫

作为List集合好兄弟Map,我们天天都在使用,一不小心就会踩坑。

今天我就来总结这些常见的坑,再捞自己一手,防止后续同学再继续踩坑。

本文设计知识点如下:

不是所有的Map都能包含

这个踩坑经历还是发生在实习的时候,那时候有这样一段业务代码,功能很简单,从XML中读取相关配置,存入Map中。

代码示例如下:

那时候正好有个小需求,需要改动一下这段业务代码。改动的过程中,突然想到HashMap并发过程可能导致死锁的问题。

于是改动了一下这段代码,将HashMap修改成了ConcurrentHashMap。

美滋滋提交了代码,然后当天上线的时候,就发现炸了。。。

应用启动过程发生NPE问题,导致应用启动失败。

根据异常日志,很快就定位到了问题原因。由于XML某一项配置问题,导致读取元素为,然后元素置入到ConcurrentHashMap中,抛出了空指针异常。

这不科学啊!之前HashMap都没问题,都可以存在,为什么它老弟ConcurrentHashMap就不可以?

翻阅了一下ConcurrentHashMapput的源码:

以下代码基于JDK1.7

这里首先判断hashCode计算产生的hash,如果相等,再判断equals的结果。但是由于Goods对象未重写的hashCode与equals方法,默认情况下hashCode将会使用父类对象Object方法逻辑。

而ObjectasList与List#subList返回List将会与原集合互相影响,且可能并不支持add等方法。同样的,这些坑爹的特性在Map中也存在,一不小心,将会再次掉坑。

Map接口除了支持增删改查功能以外,还有三个特有的方法,能返回所有key,返回所有的value,返回所有kv键值对。

//返回key的set视图Set<K>keySet;//返回所有valueCollection视图Collection<V>values;//返回key-value的set视图Set<Map.Entry<K,V>>entrySet;

这三个方法创建返回新集合,底层其实都依赖的原有Map中数据,所以一旦Map中元素变动,就会同步影响返回的集合。

另外这三个方法返回新集合,是不支持的新增以及修改操作的,但是却支持clear、remove等操作。

示例代码如下:

所以如果需要对外返回Map这三个方法产生的集合,建议再来个套娃。

newArrayList<>(map.values);

最后再简单提一下,使用foreach方式遍历新增/删除Map中元素,也将会和List集合一样,抛出ConcurrentModificationException。

总结

从上面文章可以看到不管是List提供的方法返回集合,还是Map中方法返回集合,底层实际还是使用原有集合的元素,这就导致两者将会被互相影响。所以如果需要对外返回,请使用套娃大法,这样让别人用的也安心。

第二,Map各个实现类对于的约束都不太一样,这里建议在Map中加入元素之前,主动进行空指针判断,提前发现问题。

第三,慎用自定义对象作为Map中的key,如果需要使用,一定要重写hashCode与equals方法,并且还要保证这是个不可变对象。

第三,ConcurrentHashMap是线程安全的容器,但是不要思维定势,不要片面认为使用ConcurrentHashMap就会线程安全。

版权声明:本文为CSDN博主「楼下小黑哥」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u014634309/java/article/details/105964392

图虫网站源码分享下载的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于图虫在线、图虫网站源码分享下载的信息别忘了在本站进行查找哦。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平