调用list.remove(0)时发生Strange UnsupportedOperationException

时间:2011-10-31 10:31:33

标签: java list collections

我有这个方法,它接受字符串的变量,从中创建一个List,然后尝试删除列表的第一个元素。

public void importFrom(String... files) {
    List<String> fileList = Arrays.asList(files);

    String first = fileList.remove(0);
    // other stuff
}

但是只要remove被调用,就会抛出UnsupportedOperationException。我的猜测是返回List-Type不支持remove方法。我对么?我有哪些替代方案?

5 个答案:

答案 0 :(得分:7)

Arrays.asList仅在数组周围提供了一个瘦包装器。此包装器允许您使用List API对阵列执行大多数操作。来自JavaDoc的引用:

  

返回由指定数组支持的固定大小列表。 [...]   此方法充当基于数组的API [...]

之间的桥梁

如果你真的想删除某些内容,那么这可能会有效:

List<String> realList = new ArrayList<String>(Arrays.asList(stringArray));

这个会创建一个真实的ArrayList(支持remove)并使用另一个列表的内容填充它,该列表恰好是String[]的包装。

答案 1 :(得分:4)

Arrays.asList提供数组的List视图,由数组提供BACKED。并且数组不可调整大小。任何改变其大小的尝试都会引发异常。

答案 2 :(得分:2)

您可以创建new ArrayList<String>(),然后循环遍历所有文件for (String file : files) fileList.add(file);。或者您可以使用已创建的List,并使用fileList.addAll(files);

将其添加到新的ArrayList中

答案 3 :(得分:1)

Arrays.asList()返回Arrays.ArrayList的实例,它是不可修改的列表,因为它是一个简单的数组包装器。您无法从数组中删除元素。

这是用asList()

的javadoc编写的

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

答案 4 :(得分:0)

返回的列表充当支持的数组view。您无法直接修改列表,只能通过支持的阵列修改列表。但是,您无法调整阵列大小。