有关集合转数组与数组转集合的坑

最近一直忙于 coding 和进行项目管理,就没啥时间更新 blog,今天上午趁有时间摸鱼,就简单总结一下有关集合转数组与数组转集合的坑。

问题起因1

在这里插入图片描述

在写代码的时候使用 toArray 方法 的时候就一直很好奇传入的长度为什么是 0 而不是其他(因为我参照老员工的哈哈哈,cv 战士),后来 review 代码的时候重新捡起了这个疑惑,然后翻了翻源码。

源码:

    @SuppressWarnings("unchecked")
    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

结论

个人理解应该是这样描述的 当传入的泛型数组大小小于集合大小时,使用集合大小,否则,使用数组大小。
然后翻看华山版里面也有说到这个问题,直接放图吧

在这里插入图片描述

问题起因 2

一开始在 coding 中把数组转集合的过程中,给我报了个错

java.lang.UnsupportedOperationException

网上有很多关于这个报错的解决方法,在这里我就参考华山版简单说一下原因吧:

asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。

网上我觉得比较合理的解释:

调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的市Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重新,所以会抛出异常。

结论

使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

参照:
《Java 开发手册》—华山版
java.lang.UnsupportedOperationException解决方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值