将数组转换成集合Arrays.asList,不可进行add和remove操作的原因

本文探讨了将数组转换为List的不同方式,包括使用asList的局限性及如何创建可编辑的List。介绍了通过遍历数组添加元素、利用Collections.addAll方法和通过Arrays.asList结合new ArrayList的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用asList转换的代码是返回List的实现类ArrayList集合对象

但是集合大小固定,无法添加和删除

如果想要将数组转换成一个可以具有正常添加和删除操作的List话,

一种情况就是遍历数组,一个个添加到list中

或者用Collections.addAll(list, a);
又或者直接new ArrayList<…>(Arrays.asList(a))放入另一个ArrayList

来源:优快云
原文:https://blog.youkuaiyun.com/qq_34115899/article/details/80513271

<think>嗯,用户问的是为什么用Arrays.asList()换后的集合调用add/remove/clear方法会抛出UnsupportedOperationException异常。首先,我得回忆一下Arrays.asList()的工作原理。这个方法返回的是一个固定大小的列表,底层其实是基于原数组的。所以这个列表不支持结构上的修改,比如添加或删除元素,因为这些操作会改变列表的大小,而数组的大小是固定的。 接下来,我需要确认这个返回的列表具体是什么类型的。我记得ArraysasList方法返回的是其内部的一个ArrayList类,但这个类并不是java.util.ArrayList,而是Arrays类的静态内部类。这个内部类没有覆盖addremove等方法,所以当调用这些方法时,实际上调用的是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()`方法修改元素值,因为它不会改变集合大小。 - 对原始数组的修改会同步到集合中(二者共享存储空间)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值