无法对 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&lt;T&gt;,实现List 【参考方案1】:

除了@dan1st 的回答(现在还有@JonSkeet),您可以创建自己的asList() 方法来返回一个可变 List&lt;T&gt;

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&lt;MyObject&gt; = Arrays.asList(myObjectArray);之类的事情是不是错了? 是的,这是行不通的,因为它不会创建ArrayList,而只会尝试分配给ArrayList,从而导致编译时错误,因为Arrays.asList 不会返回@987654336 @. 我添加了文档链接。【参考方案3】:

Arrays.asList() 返回由原始数组支持的List&lt;T&gt; 实现。 (换成数组可以通过列表看到,反之亦然。)

数组在 Java 中具有固定大小,因此 Arrays.asList 返回的列表也必须具有固定大小 - 您无法添加,也无法从中删除。

您可以改为创建一个新的ArrayList&lt;T&gt;,它会创建数组的副本

List<Integer> list = new ArrayList<>(Arrays.asList(...));

虽然ArrayList 仍然由数组支持,但它会在必要时创建一个新数组。该数组是一个实现细节,而不是 Arrays.asList 返回的现有数组的“视图”。

【讨论】:

以上是关于无法对 ArrayList 执行操作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法对参数化类型 ArrayList<Foo> 执行 instanceof 检查

List 的主要实现类:ArrayList

Java - 删除 ArrayList 中的重复项

C#ArrayList重复数据删除

Collections工具类:操作集合的工具类

将ArrayList解析为日期[重复]