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;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值