代码之家  ›  专栏  ›  技术社区  ›  Chathuranga Chandrasekara

尝试从array.aslist返回的列表中删除时发生UnsupportedOperationException

  •  39
  • Chathuranga Chandrasekara  · 技术社区  · 15 年前

    我用的是 List 保存通过调用 Array.asList() 方法。然后我尝试用 myList.Remove(int i) 方法。但是当我试着这样做的时候,我得到了 UnsupportedOperationException .为什么会这样?我应该如何解决这个问题?

    6 回复  |  直到 6 年前
        1
  •  59
  •   Jon Skeet    11 年前

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

    医生们并没有尽可能清楚地说明这一点,但是他们 说:

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

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

    尽管有其他方法可以解决这个问题(其他方法可以创建一个新的 ArrayList 如果没有额外的库,我个人建议 Google Collections Library (或) Guava ,当它被释放时)。然后可以使用:

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

    我建议这样做的原因是GCL通常是一件好事,值得使用。

    如注释所述,这需要 复制 数组的;原始数组不支持列表,并且在另一个集合中不会看到任何集合中的更改。

        2
  •  22
  •   Pleymor    6 年前

    它不是 java.util.ArrayList . Arrays.asList() 返回自己 List 实现(对数组进行“写入”更改)。

    这是一个 固定尺寸 列出,这样它就不支持删除。

    你可以创造一个真正的 ArrayList 从:

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

    很难理解 asList() 工作,我必须承认。

        3
  •  6
  •   sleske    15 年前

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

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

    注意,collections.remove(int)在javadocs中标记为“可选操作”,这意味着并非所有的集合都支持它。“固定大小列表”意味着您不能更改列表的大小,而remove()可以这样做。所以不支持。

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

        4
  •  5
  •   Stefan Ernst    15 年前

    从aslist接收到的实现没有实现完整的列表接口。我将把列表转换为arraylist,然后对其进行修改。

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

        5
  •  0
  •   St.Shadow    15 年前

    因为你得到了只读列表。 尝试

    List newList = new ArrayList(myList);
    
        6
  •  0
  •   shubomb    7 年前

    使用

    数组列表而不是列表

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