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()我必须承认,这是多么令人困惑的工作方式.
请阅读Arrays.asList()的API文档:
返回由指定数组支持的固定大小的列表.(对返回列表的更改"直写"到数组.)
请注意,Collections.remove(int)在Javadocs中标记为"可选操作",这意味着并非所有集合都支持它."固定大小列表"表示您无法更改列表的大小,remove()会执行此操作.所以它不受支持.
如果要更改Arrays.asList()生成的列表,只需复制它,例如new ArrayList(Arrays.asList(...)).
您从asList收到的实现没有实现完整的List接口.我会将列表转换为ArrayList,然后对其进行修改.
请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29