谁再用Arrays.asList就开除谁
阿昌 Java小菜鸡

谁再用Arrays.asList就开除谁

hi,我是achang,今天说一个使用Arrays.asList后对应出现的一系列坑,因为他有那么多坑,所以会有开玩笑的说:谁再用Arrays.asList就开除谁

Arrays.asList的作用很简单,就是把传入多参 或者 数组 直接转化为 List,如下代码:

1
List<String> list = Arrays.asList("1", "2", "3");

一、List转化坑

通过这样子的调用,就可以获得一个装有"1","2","3"List

image
如果如上图写编写使用的话,最终会获得一个长度为1的List集合,而并非为长度为3的List集合。

这个问题的出现是,当我们使用一个基本类型的数组作为入参的时,他不会把基本数组中的每个元素作为List转化,而是把基本类型数组作为整体转化为List中的1个元素

那如果想要解决上面的问题,就想要把基本类型数组改为包装类Integer就可以解决。

image

二、UnsupportedOperationException坑

当用Arrays.asList创建出来的List对象,使用如add()等方法时,就会抛出UnsupportedOperationException异常
image
如上报错的原因是,调用Arrays.asList时创建的List对象时Arrays类的内部类对象,而这个内部类的List,是继承的AbstractList类,他并没重写add()方法。

image
AbstractList类中的add方法默认就是抛出UnsupportedOperationException异常

image

三、引用问题

Arrays.asList生成的List后,当修改原来数组的值,会发现用Arrays.asList生产的List也会修改值。

image

针对二、三这样子的坑解决方案:

如果要对创建的List进行增删操作的话,建议直接new ArraysList,如下图所示:

  • 针对原来基本数组的元素修改时,发现并不会影响
    image

  • 对生成的List对象进行调用add()方法,发现不会抛出UnsupportedOperationException异常
    image


四、总结

针对Arrays.asList对应的坑,所以不推荐使用Arrays.asList,来直接从根源上避免出现坑。
不然就想要注意在使用中的场景是否符合你的要求,如不对Arrays.asList创建的List进行增删改的操作。

建议统一的使用一个数组转ArrayList的工具类,要么自己实现,要呢推荐已有的工具类,如:com.google.common.collect等等

 请作者喝咖啡