java.util.Arrays
的asList
方法能够方便的将数组转化为集合,咱们平时开发在初始化ArrayList
时使用的比较多,能够简化代码,但这个静态方法asList()
有几个坑须要注意:html
一. 若是对集合使用增长或删除元素的操做将会报错
以下代码:java
List list = Arrays.asList("a","b","c"); list.add("d");
输出结果:数组
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at ArraysAsListTest.main(ArraysAsListTest.java:7)
Arrays.asList
的源码虽然返回的是一个ArrayList
,但这个ArrayList
是Arrays内部的一个静态类(java.util.Arrays.ArrayList
),并非咱们平时用的java.util.ArrayList
只是名字同样,包名不同:google
这个ArrayList
也继承自AbstractList
,可是却没有实现add()
,remove()
方法用这两个方法其实调用的是AbstractList
的默认方法:code
public void add(int index, E element) { throw new UnsupportedOperationException(); }
直接抛出" UnsupportedOperationException
"的异常!htm
因此当咱们调用这个ArrayList
的add
方法时实际上是调用了抽象集合类里的add
方法,就抛出了上面的异常,缘由是数组虽然提供了转集合的方法, 但本质上仍是个数组,数组的长度是固定的,因此jdk的做者没有实现add()
和remove()
方法。blog
你们在使用的时候须要注意,要结合具体业务场景判断:若是只是对转成后的集合进行遍历或使用stream()流操做都没有问题,能够正常使用(修改元素也没问题) 但若是须要新增元素或删除元素等改变集合长度的操做就要避免,不然报错就会影响到咱们正常的业务逻辑。继承
二. 长度问题
仍是Arrays
的asList()
,该方法没法将一个基本类型的数组转换成集合List,或者说基本类型虽然能转换成功,但不是"咱们想要的集合",由于asList
方法接收的是一个泛型的变长参数。element
而基本数据类型是没法被泛型化的,这样的话对于泛型而言,基本数据类型会被做为一个"[x"的类型,"["表示这是一个数组,"x"为当前数组的类型,例如: int[] 实际上它的类型是"[I"开发
这样的话Arrays.asList
传入的参数是基本类型的话,会把数组当作一个元素处理(长度=1),若是咱们要遍历List
或获取List
的长度就不许确了,相似下面的用法:
int array[] = {1,2,3,4,5}; List list = Arrays.asList(array); System.out.println("长度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
输出结果:
长度=1 是否含有元素3=false
若是咱们的代码里用到了这样获取长度或判断是否包含指定元素的操做就要注意写法,不然就会影响咱们的逻辑流程!
为避免这样的问题出现,有不少种其余写法,好比将array转成包装类(即引用类型),以下:
Integer array[] = {1,2,3,4,5}; List list = Arrays.asList(array); System.out.println("长度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
输出结果:
长度=5 是否含有元素3=true
固然也可使用google的集合类"Ints.asList",以下:
int array[] = {1,2,3,4,5}; List list = Ints.asList(array); System.out.println("长度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
输出结果:
长度=5 是否含有元素3=true
可是google的Ints.asList
方法返回的list也是一个本身实现的集合,一样不支持add
和remove
方法,若是既要保证转换成list后的数据长度正确又要能增删操做的话,就用java.util.ArrayList吧。