被Arrays和Collections毒害的一天......起因 作为一个每日闲逛的喽啰呢, 每天都很开心的整点花活,
起因
作为一个每日闲逛的喽啰呢, 每天都很开心的整点花活, 这不最近做了一个自己的小项目中就用到了Arrays和Collections这两个工具, 结果就是被暴打一顿的感觉..... 原来这两个方法是这样的!!!
事情经过
在构建数组时,一般使用Arrays下面有个asList方法可以迅速将一个内容构建成数组,大家应该很熟悉吧,如下图:

提醒
但是如果你指使用一个内容进行asList构建时IDEA其实会给你提示优化内容的, 大概意思是, 这只是一个数组,应该使用Collections下的singletonList, 提示信息: Call to 'asList()' with only one argument
如下图:
说实话看到这样的提示大家都应该点一下, 不是说人家大厂的标准都是代码中的Warn不超过10个嘛,

上图就是Warn ↑↑↑↑↑↑↑ .....嘻嘻.....不过不点不要紧,点了直接给我干迷糊了!!!!(🤯不嘻嘻)生气
Collections与Arrays相同异常
根据上面的提示,我们将Arrays替换成了Collection, 创建了List, 并且在循环中累计给该List填充数据,想法很好,实现全是红字字......, Add方法执行后如下:


好家伙, 两错是一样的, 没办法,先用new ArrayList<>()试试吧, 这个确实可以, 哎这是为什么呢
分析
英语不好,先翻译下报错, UnsupportedOperationException :意思是“不支持的操作异常”
哎, 啥就不支持操作啊, 你不是List吗,等等, 又仔细一下,我们之前的new ArrayList<>() 其实是实现类, List 是接口啊, 对, 我们点进去看看Arrays的实现和Collections实现嘛。 实现如下:
Collections.singletionList

好家伙, 一个内部实现类, 那Arrays呢, 如下:
Arrays.asList

果然不出意料, 哥俩不说一摸一样, 也是同根相同.....都是内部实现类呗, 并且两个兄弟都是继承的AbstractList在继承的List,所以执行时是到AbstractList下进行执行add, 先看一下Collections下的下的关系图:

确实是需要走AbstractList,那我们在SingletonList找找实现add, 发现没有, 是AbstractList这个父类重写了, 调用只走父类.....我靠, 然后点进去一下瞬间懂了, 靠.....
AbstractList

报错在这里, 好吧疑惑解答了, 原来是Arrays和Collections创建的List使用的内部实现类, 并且继承的是AbstractList, 并且没有重写add方法.... 明白了这个之后, 迅速检查了一下项目下的Arrays和Collections, 嗯...应该是没有了, 问题不大, 哎又是被教育的一天...
警示
其实事情的发生到我排查是有间隔的, 这很大的说明了其实我们不想去了解内部的构造,其实这是不好的, 算是对我的一个警告吧,下次有问题一定要一点点的排查。 细心。
最后, 最好的讲解不如亲身了解, 如果你还想知道更多Arrays和Collections的用法请去阅读源码吧
转载自:https://juejin.cn/post/7408072039921664052