我使用List
来保存通过调用Array.asList()
方法获得的一些数据。然后我尝试使用myList.Remove(int i)
方法删除元素。但是当我尝试这样做时,我得到了UnsupportedOperationException
。这是什么原因?我该如何解决这个问题?
答案 0 :(得分:59)
Array.asList()
在列表界面中包装一个数组。该列表仍由数组支持。数组是固定大小的 - 它们不支持添加或删除元素,因此包装器也不能。
文档并没有尽可能明确,但他们做说:
返回由指定数组支持的固定大小的列表。
“固定大小”位应该是一个不能添加或删除元素的提示:)
虽然还有其他方法可以解决此问题(从数组中创建新ArrayList
的其他方法),但没有额外的库,我个人建议您抓住Google Collections Library(或{{3} ,当它被释放时)。然后您可以使用:
List<Integer> list = Lists.newArrayList(array);
我之所以这样说是因为GCL是一件好事,非常值得使用。
如评论中所述,这需要数组的副本;该列表不受原始数组的支持,并且任何一个集合中的更改都不会在另一个集合中看到。
答案 1 :(得分:22)
不是java.util.ArrayList
。 Arrays.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既不能添加项目也不能删除项目