谁再用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
如果如上图写编写使用的话,最终会获得一个长度为1
的List集合,而并非为长度为3
的List集合。
这个问题的出现是,当我们使用一个基本类型的数组作为入参的时,他不会把基本数组中的每个元素作为List转化,而是把基本类型数组作为整体转化为List中的1个元素
。
那如果想要解决上面的问题,就想要把基本类型数组改为包装类Integer
就可以解决。
二、UnsupportedOperationException坑
当用Arrays.asList
创建出来的List对象,使用如add()等方法时,就会抛出UnsupportedOperationException异常
。
如上报错的原因是,调用Arrays.asList
时创建的List对象时Arrays
类的内部类对象,而这个内部类的List,是继承的AbstractList
类,他并没重写add()方法。
AbstractList类中的add方法默认就是抛出UnsupportedOperationException异常
三、引用问题
Arrays.asList
生成的List后,当修改原来数组的值,会发现用Arrays.asList
生产的List也会修改值。
针对二、三这样子的坑解决方案:
如果要对创建的List进行增删操作的话,建议直接new ArraysList
,如下图所示:
针对原来基本数组的元素修改时,发现并不会影响
对生成的List对象进行调用add()方法,发现不会抛出UnsupportedOperationException异常
四、总结
针对Arrays.asList
对应的坑,所以不推荐使用Arrays.asList
,来直接从根源上避免出现坑。
不然就想要注意在使用中的场景是否符合你的要求,如不对Arrays.asList
创建的List进行增删改的操作。
建议统一的使用一个数组转ArrayList的工具类,要么自己实现,要呢推荐已有的工具类,如:com.google.common.collect
等等