Arrays.asList 为何不能添加和删除元素?

当使用Arrays.asList()创建的List尝试执行remove操作时,会抛出UnsupportedOperationException。这是因为Arrays$ArrayList没有实现remove方法。解决办法是将Arrays.asList()生成的List转换为ArrayList。问题源于Arrays$ArrayList与ArrayList虽然名字相似,但实现的接口不同,前者不支持修改操作。了解这些差异对于避免此类异常至关重要。

        在调用 Arrays.asList(T… a) 生成的 List 的 remove 方法删除元素时,会报异常: 

public static void main(String [] a)  {
        List<Integer> integers = Arrays.asList(1,2,3,4,5,6);
        // remove操作:java.lang.UnsupportedOperationException
        integers.removeIf(n -> n < 4);
        integers.forEach(System.out::println);
    }

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.remove(AbstractList.java:161)
    at java.util.AbstractList$Itr.remove(AbstractList.java:374)
    at java.util.Collection.removeIf(Collection.java:415)

解决:

        使用 Arrays.asList(T… a) 生成的 List 做参数重新构造一个 java.util.ArrayList 即可解决此问题

public static void main(String [] a)  {
        List<Integer> integers = Arrays.asList(1,2,3,4,5,6);
        // 构建一个新的List
        List<Integer> newList = new ArrayList<>(integers);
        newList.removeIf(n -> n < 4);
        newList.forEach(System.out::println);
    }

原因:

        java.util.Arrays.ArrayList java.util.ArrayList 实现的接口不同

  • java.util.ArrayList实现了java.util.List接口
  • java.util.Arrays.ArrayList继承的java.util.AbstractList方法没有实现java.util.List接口中remove方法的逻辑

        如下,Arrays 中的 ArrayList 继承了 AbstractList

        我们进入 AbstractList 抽象类,查看它的 add() 和 remove() 方法

        代码中已经很清楚了,直接 throw new UnsupportedOperationException()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值