尝试从Array.asList返回的列表中删除时,UnsupportedOperationException

Cha*_*ara 41 java exception list

我使用a List来保存通过调用Array.asList()方法获得的一些数据.然后我试图使用myList.Remove(int i)方法删除元素.但是当我尝试这样做时,我得到了一个UnsupportedOperationException.这是什么原因?我该如何解决这个问题?

Jon*_*eet 64

Array.asList() 在列表界面中包装一个数组.该列表仍由数组支持.数组是固定大小的 - 它们不支持添加或删除元素,因此包装器也不能.

文档并没有尽可能清楚地表明这一点,但他们确实说:

返回由指定数组支持的固定大小的列表.

"固定大小"位应该是一个提示,你不能添加或删除元素:)

虽然还有其他方法可以解决这个问题(其他方法来创建一个新ArrayList的数组)而没有额外的库,但我个人建议你掌握Google Collections Library(或Guava,当它发布时).然后你可以使用:

List<Integer> list = Lists.newArrayList(array);
Run Code Online (Sandbox Code Playgroud)

我之所以这么说是因为GCL是一件好事,值得使用.

如评论中所述,这需要数组的副本 ; 该列表不由原始数组支持,并且任何一个集合中的更改都不会在另一个集合中看到.


Car*_*los 23

事实并非如此java.util.ArrayList.Arrays.asList()返回自己的List实现(将更改"写入"到数组中.).

它是一个固定大小的列表,因此它不支持删除.

你可以从中创建一个真实的ArrayList:

new java.util.ArrayList<>(Arrays.asList(someArray));  
Run Code Online (Sandbox Code Playgroud)

asList()我必须承认,这是多么令人困惑的工作方式.


sle*_*ske 7

请阅读Arrays.asList()的API文档:

返回由指定数组支持的固定大小的列表.(对返回列表的更改"直写"到数组.)

请注意,Collections.remove(int)在Javadocs中标记为"可选操作",这意味着并非所有集合都支持它."固定大小列表"表示您无法更改列表的大小,remove()会执行此操作.所以它不受支持.

如果要更改Arrays.asList()生成的列表,只需复制它,例如new ArrayList(Arrays.asList(...)).


Ste*_*nst 6

您从asList收到的实现没有实现完整的List接口.我会将列表转换为ArrayList,然后对其进行修改.

请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29