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