无法对 ArrayList 执行操作 [重复]
Posted
技术标签:
【中文标题】无法对 ArrayList 执行操作 [重复]【英文标题】:Unable to perform an operation on ArrayList [duplicate] 【发布时间】:2021-11-24 02:26:15 【问题描述】:我的意图是对ArrayList
进行浅层克隆,但在此之前我在修改列表时遇到了问题。
在列表中添加另一个元素
UnsupportedOrderException
为什么?
class Mine implements Cloneable
public List<Integer> list;
Mine(List<Integer> mylist)
this.list = mylist;
public Object clone() throws CloneNotSupportedException
return super.clone();
class Demo
public static void main(String[] args) throws CloneNotSupportedException
List<Integer> klist= Arrays.asList(10,20,30,40,50);
Mine m1=new Mine(klist);
m1.list.add(11); // <- why i am unable to add to the list
Mine m2= (Mine) m1.clone();
【问题讨论】:
@AritroShome,List
是一个有很多实现的接口,而不仅仅是ArrayList
。
List
是一个接口,它本身没有实现。改用ArrayList<T>
,实现List
【参考方案1】:
除了@dan1st 的回答(现在还有@JonSkeet),您可以创建自己的asList()
方法来返回一个可变 List<T>
:
static public List<T> asMutableList(T ... elts)
List<T> lst = new ArrayList<>(elts.length);
for (T el : elts)
lst.add(el);
return lst;
【讨论】:
【参考方案2】:您不能更改Arrays.asList
返回的List
(使用add()
或remove()
或类似)的元素数量(但它允许使用.set()
更改元素)。
来自the docs of Arrays.asList
:
返回的列表实现了可选的 Collection 方法,那些会改变返回列表大小的方法除外。这些方法使列表保持不变并抛出 UnsupportedOperationException。
相反,您可以创建一个具有相同元素的ArrayList
:
List<Integer> klist= new ArrayList<>(Arrays.asList(10,20,30,40,50));
【讨论】:
一般来说,只有当您打算永远不修改List
时,In 才会使用 Arrays.asList
。
@dan1st 做ArrayList<MyObject> = Arrays.asList(myObjectArray);
之类的事情是不是错了?
是的,这是行不通的,因为它不会创建ArrayList
,而只会尝试分配给ArrayList
,从而导致编译时错误,因为Arrays.asList
不会返回@987654336 @.
我添加了文档链接。【参考方案3】:
Arrays.asList()
返回由原始数组支持的List<T>
实现。 (换成数组可以通过列表看到,反之亦然。)
数组在 Java 中具有固定大小,因此 Arrays.asList
返回的列表也必须具有固定大小 - 您无法添加,也无法从中删除。
您可以改为创建一个新的ArrayList<T>
,它会创建数组的副本:
List<Integer> list = new ArrayList<>(Arrays.asList(...));
虽然ArrayList
仍然由数组支持,但它会在必要时创建一个新数组。该数组是一个实现细节,而不是 Arrays.asList
返回的现有数组的“视图”。
【讨论】:
以上是关于无法对 ArrayList 执行操作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章