欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中数组转List,一些你意想不到的坑

程序员文章站 2022-05-10 16:21:00
...

说起这个数组转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
Java中数组转List,一些你意想不到的坑
这个异常的意思就是你调用了一个还没有实现的方法。看到这里就纳闷了,代码看起来没问题啊,为啥出错了?
我们跟进这个Arrays类去看看asList()方法:
Java中数组转List,一些你意想不到的坑
乍一看返回的也是ArrayList类,没啥问题啊,但是实际上它返回的是它的一个内部类java.util.Arrays$ArrayList。就是下面定义的那个内部类。

同名的尴尬。这个内部类虽然也继承了List,但是没有实现重写add(),remove()这样的操作集合的方法,所以就会报错。

并且这里面还隐藏了一个问题,在使用Arrays.asList()把数组转成集合的时候,当你再次修改了数组中的值,你会发现集合中的值也会相应的跟着改变。

还有一个问题,如果你的集合是一个基本数据类型的集合,在用这个方法去转成集合的时候,观察一下数据类型,你会大吃一惊,竟然把这个数组当成一个数据存放在了list中的一个位置:
Java中数组转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;
    }

这样我们就能愉快的去操作集合了。