Java中数组转List,一些你意想不到的坑
说起这个数组转List,马上就会想到Arrays.asList()。没错,这个是可以转成功的。
看下这个小例子:
// int[] arrs = new int[]{1,2,3,4,5,6,7,8};
Integer[] arrs = new Integer[]{1,2,3,4,5,6,7,8};
System.out.println("test1:"+arrs.length);
List<Integer> list = Arrays.asList(arrs);
System.out.println("test2:"+list.size());
输入都正常
test1:8
test2:8
一般情况下呢,我们都是在最后所有数据整理完毕后发现原来方法需要一个List,而我们的是个数组,然后用这个Arrays.asList()去转一下就行了。所以就不会暴漏出一些个问题。
什么问题呢,我们继续往下走:
转成List之后我们对这个集合做一下操作:
list.add(9);
System.out.println(list.size());
然后再输出下集合的长度,结果就傻脸了,报错了。。
Exception in thread “main” java.lang.UnsupportedOperationException
这个异常的意思就是你调用了一个还没有实现的方法。看到这里就纳闷了,代码看起来没问题啊,为啥出错了?
我们跟进这个Arrays类去看看asList()方法:
乍一看返回的也是ArrayList类,没啥问题啊,但是实际上它返回的是它的一个内部类java.util.Arrays$ArrayList。就是下面定义的那个内部类。
同名的尴尬。这个内部类虽然也继承了List,但是没有实现重写add(),remove()这样的操作集合的方法,所以就会报错。
并且这里面还隐藏了一个问题,在使用Arrays.asList()把数组转成集合的时候,当你再次修改了数组中的值,你会发现集合中的值也会相应的跟着改变。
还有一个问题,如果你的集合是一个基本数据类型的集合,在用这个方法去转成集合的时候,观察一下数据类型,你会大吃一惊,竟然把这个数组当成一个数据存放在了list中的一个位置:
所以我们一定要慎用Arrays.asList()这个方法。
那我们有什么方法可以代替它么,有人说可以用循环,但是循环多low啊,
我们可以用这个方法
List list2 = new ArrayList();
Collections.addAll(list2,arrs);
进去这个方法看看实际上用的也是循环,但是总比我们自己写循环要高大上些吧:
public static <T> boolean addAll(Collection<? super T> c, T... elements) {
boolean result = false;
for (T element : elements)
result |= c.add(element);
return result;
}
这样我们就能愉快的去操作集合了。