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

时间:2009-10-26 10:45:29

标签: java exception list

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

6 个答案:

答案 0 :(得分:59)

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

文档并没有尽可能明确,但他们说:

  

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

“固定大小”位应该是一个不能添加或删除元素的提示:)

虽然还有其他方法可以解决此问题(从数组中创建新ArrayList的其他方法),但没有额外的库,我个人建议您抓住Google Collections Library(或{{3} ,当它被释放时)。然后您可以使用:

List<Integer> list = Lists.newArrayList(array);

我之所以这样说是因为GCL是一件好事,非常值得使用。

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

答案 1 :(得分:22)

不是java.util.ArrayListArrays.asList()返回自己的List实现(将更改“写入”到数组中。)。

这是固定大小列表,因此不支持删除。

您可以从中创建真实的ArrayList

new java.util.ArrayList<>(Arrays.asList(someArray));  

我必须承认,asList()的工作原理非常混乱。

答案 2 :(得分:6)

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

  

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

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

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

答案 3 :(得分:5)

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

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

答案 4 :(得分:0)

因为您获得了只读列表。 试试

List newList = new ArrayList(myList);

答案 5 :(得分:0)

使用

  

ArrayList而不是List

List有固定大小的元素,List既不能添加项目也不能删除项目