Arrays.asList转换为List集合后使用add方法抛出UnsupportedOperationException

问题场景:

        

        将String[] 数组转为 List集合,后对list集合进行添加删除报UnsupportedOperationException

百度原因:

        Arrays.asList返回的集合不支持元素的添加和删除(不支持add、addAll、remove方法),否则抛出UnsupportedOperationException(不支持操作异常)。

分析原理:

        首先先分析Arrays.asList源码

可以看出asList方法中是new ArrayList,而内部类ArrayList是继承的AbstractList类

发现AbstractList类中的add方法是抛出异常,因此需要内部类ArrayList重写add、remove方法才可以使用,因此asList方法返回的内部类不能调用add、remove方法。

如何解决?

         新建一个ArrayList即可解决

<think>嗯,用户问的是为什么用Arrays.asList()转换后的集合调用add/remove/clear方法抛出UnsupportedOperationException异常。首先,我得回忆一下Arrays.asList()的工作原理。这个方法返回的是一个固定大小的列表,底层其实是基于原数组的。所以这个列表不支持结构上的修改,比如添加或删除元素,因为这些操作会改变列表的大小,而数组的大小是固定的。 接下来,我需要确认这个返回的列表具体是什么类型的。我记得ArraysasList方法返回的是其内部的一个ArrayList类,但这个类并不是java.util.ArrayList,而是Arrays类的静态内部类。这个内部类没有覆盖add、remove等方法,所以当调用这些方法时,实际上调用的是AbstractList的默认实现,而这些默认实现会抛出UnsupportedOperationException异常。 然后,用户可能需要知道如何解决这个问题。也就是说,如果他们需要一个可修改的集合,应该怎么做。这时候应该建议他们使用new ArrayList<>(Arrays.asList(array)),这样会创建一个新的java.util.ArrayList,从而支持所有的修改操作。 另外,可能还需要解释为什么这样的设计存在。因为Arrays.asList()的设计初衷是为了提供一个轻量级的列表视图,避免数组数据的复制,从而提高效率。因此,它保留了数组固定大小的特性,不允许结构修改。 最后,用户可能没有意识到返回的列表和标准ArrayList的区别,所以需要明确说明两者不同的实现类,以及这种设计导致的限制。同时,可能还要提醒其他需要注意的地方,比如如果修改数组元素,列表中的元素也会跟着变,因为列表是直接基于数组的。 总结起来,回答的结构应该是先说明现象,再解释原因,接着给出解决方案,最后可能补充相关的注意事项。然后按照用户的要求,生成相关问题,这些问题应该围绕Arrays.asList()的限制、替代方法、内部实现等展开。</think><< 当使用`Arrays.asList()`将数组转换集合时,返回的集合是一个**固定大小**的列表视图,底层由原始数组支持。因此,调用`add()`、`remove()`、`clear()`等会改变集合结构的方法时,会抛出`UnsupportedOperationException`异常。以下是详细解释: ### 原因分析 1. **底层实现限制** `Arrays.asList()`返回的是`Arrays`内部类`ArrayList`(非`java.util.ArrayList`),它是一个基于数组的包装类,未实现修改集合方法。 ```java // 示例代码 List<String> list = Arrays.asList("A", "B", "C"); list.add("D"); // 抛出 UnsupportedOperationException ``` 2. **数组固定性** 数组的长度是固定的,而`add/remove/clear`等操作会尝试改变集合大小,这与数组的固定长度特性冲突,因此被禁止。 ### 解决方法 如果需要可修改的集合,可以显式创建新的`ArrayList`: ```java List<String> mutableList = new ArrayList<>(Arrays.asList("A", "B", "C")); mutableList.add("D"); // 正常执行 ``` ### 注意事项 - 即使通过`Arrays.asList()`获得的集合是固定大小的,仍可通过`set()`方法修改元素值,因为它不会改变集合大小。 - 对原始数组的修改会同步到集合中(二者共享存储空间)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值