无法对 ArrayList 执行操作

Unable to perform an operation on ArrayList

我的意图是对 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();
    }
}

您不能更改 List 的元素数量(使用 add()remove() 或类似)由 Arrays.asList 返回(但它允许更改元素使用.set()).

来自the docs of Arrays.asList

The returned list implements the optional Collection methods, except those that would change the size of the returned list. Those methods leave the list unchanged and throw UnsupportedOperationException.

相反,您可以创建具有相同元素的 ArrayList

List<Integer> klist= new ArrayList<>(Arrays.asList(10,20,30,40,50));

Arrays.asList() returns 由原始数组支持的 List<T> 实现。 (改为数组可以通过列表看到,反之亦然。)

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

您可以创建一个新的 ArrayList<T>,它会创建数组的 副本

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

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

返回的列表是对现有数组的“视图”

除了@dan1st 的答案(现在还有@JonSkeet)之外,您还可以创建自己的asList() 方法来return mutable 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;
}