提问人:Chathuranga Chandrasekara 提问时间:10/26/2009 最后编辑:Vasily KabunovChathuranga Chandrasekara 更新时间:8/7/2020 访问量:26336
尝试从 Array.asList 返回的列表中删除时的 UnsupportedOperationException
UnsupportedOperationException when trying to remove from the list returned by Array.asList
问:
我正在使用 a 来保存通过调用方法获得的一些数据。然后我尝试使用方法删除一个元素。但是,当我尝试这样做时,我得到了一个.这是什么原因呢?我应该如何解决这个问题?List
Array.asList()
myList.Remove(int i)
UnsupportedOperationException
答:
从 asList 收到的实现不会实现完整的 List 接口。我会将列表转换为 ArrayList,然后对其进行修改。
参见 remove()。
评论
不是. 返回它自己的实现(将更改“写入”到数组中)。java.util.ArrayList
Arrays.asList()
List
这是一个固定大小的列表,因此不支持删除。
你可以从中创建一个真实:ArrayList
new java.util.ArrayList<>(Arrays.asList(someArray));
我必须承认,工作方式非常令人困惑。asList()
因为你得到的是只读列表。 尝试
List newList = new ArrayList(myList);
Array.asList()
在 list 接口中包装一个数组。该列表仍由数组支持。数组是固定大小的 - 它们不支持添加或删除元素,因此包装器也不能。
文档并没有尽可能清楚地说明这一点,但他们确实说:
返回由指定数组支持的固定大小列表。
“固定大小”位应该提示您不能添加或删除元素:)
虽然还有其他方法可以解决这个问题(从数组创建新的其他方法),但没有额外的库,我个人建议获得 Google 收藏库(或番石榴,当它发布时)。然后,您可以使用:ArrayList
List<Integer> list = Lists.newArrayList(array);
我之所以提出这个建议,是因为 GCL 总体上是一件好事,非常值得使用。
如注释中所述,这需要数组的副本;原始数组不支持该列表,并且不会在另一个集合中看到任何一个集合中的更改。
评论
.asList()
List
Dynamic Array
List<E>
List.of
List.copyOf
asList()
List
Dynamic Array
List<E>
List<E>
List<E>
请阅读 Arrays.asList() 的 API 文档:
返回由指定数组支持的固定大小列表。(对返回列表的更改 “写通”到数组。
请注意,Collections.remove(int) 在 Javadocs 中被标记为“可选操作”,这意味着并非所有 Collections 都支持它。“固定大小列表”表示您不能更改列表的大小,而 remove() 可以这样做。所以它不受支持。
如果要更改 Arrays.asList() 生成的列表,只需复制它,例如 .new ArrayList(Arrays.asList(...))
用
ArrayList 而不是 List
列表有固定大小的元素,列表既不能添加项目,也不能删除项目
评论