为什么阿里规约手册要求谨慎使用Arrays.asList方法

为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
前言 在开发中,有时候会碰到把多个参数,或者说把数组转成List的需求,通常我们会使用 Arrays.asList()方法。但是该方法在使用的过程中,稍有不慎就会出现严重的异常。有如下代码:

@Test public void test() { List list = Arrays.asList("a", "a", "2"); System.out.println(list.size()); list.add("blog.happyjava.cn"); System.out.println(list.size()); }

运行之后,出现了异常:
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
阿里Java规约中的强制性要求 在阿里Java规约中有强制性的要求:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
阿里规约里已经提示了asList返回的对象是Arrays的一个内部类。那么这个内部类,跟我们一般用到的List(如ArrayList)有什么不一样之处呢,下面我们就来分析下。
Arrays.asList()源码分析 通过IDEA查看该方法源码,如下:
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
这里返回了一个ArrayList,看起来似乎没什么问题,但是这个ArrayList跟我们常用的java.util.ArrayList不一样。通过IDEA点击跳转,可以看到该ArrayList是Arrays的一个内部类。
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
该内部类的源码其实不多,通过IDEA的structure,我们可以看到它实现的方法如下:
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片
可以看到,这里是没有实现我们最常用的add方法的。
那么,调用add等方法的时候,UnsupportedOperationException 异常是哪里抛出来的呢?我们看它继承的java.util.AbstractList类,该类的add方法如下:
public boolean add(E e) { add(size(), e); return true; }

这里有一个重载的add方法,再点进去查看:
public void add(int index, E element) { throw new UnsupportedOperationException(); }

可以看到,是这里抛出了UnsupportedOperationException。
总结 Arrays.asList()是开发中非常常用的方法,所以我们一定要了解其存在的坑点。如果把其返回的ArrayList当做了我们常用的java.util.ArrayList,那么是很容易埋下生产隐患的。
写在最后
欢迎大家加入粉丝交流群:963944895,群内免费分享Spring框架、Mybatis框架、SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图
比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 我们必须不断学习,否则我们将被学习者超越!
【为什么阿里规约手册要求谨慎使用Arrays.asList方法】趁年轻,使劲拼,给未来的自己一个交代!
为什么阿里规约手册要求谨慎使用Arrays.asList方法
文章图片

    推荐阅读