枚举列表删除问题

时间:2016-04-01 11:41:12

标签: java list enums enumeration

任何人都可以帮我解决问题吗?

public static void main(String[] args) 
{
    List<TestEnum> list1 = new ArrayList<TestEnum>();
    list1.add(TestEnum.ONE);
    list1.add(TestEnum.TWO);
    list1.add(TestEnum.THREE);

    System.out.println(list1);
    System.out.println(list1.remove(TestEnum.TWO));
    System.out.println(list1);

    System.out.println("-----------------------");

    TestEnum[] xx = new TestEnum[]{TestEnum.ONE, TestEnum.TWO, TestEnum.THREE};
    List<TestEnum> list2 = Arrays.asList(xx);

    System.out.println(list2);
    System.out.println(list2.remove(TestEnum.TWO));
    System.out.println(list2);
}

以下是结果 -

[ONE, TWO, THREE]
true
[ONE, THREE]
-----------------------
[ONE, TWO, THREE]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at java.util.AbstractCollection.remove(Unknown Source)
at Test.main(Test.java:24)

请帮助 - 为什么会这样,我还检查了哈希码?

4 个答案:

答案 0 :(得分:13)

Arrays.asList()返回的列表具有固定大小 - 它所支持的数组的大小。它不支持可能导致尺寸变化的操作:add()addAll()remove()removeAll()retainAll()clear()

您可以使用以下习惯用法创建可修改大小的列表:

List<TestEnum> = new ArrayList<>(Arrays.asList(xx));

这将创建一个由ArrayList结果复制的元素初始化的普通Arrays.asList()

答案 1 :(得分:2)

Arrays.asList返回不可变列表的实例,无法调用remove。你必须将它包装在新列表中

new ArrayList(Arrays.asList(xx))

答案 2 :(得分:2)

如果您查看asList类的方法Arrays,您会看到返回new ArrayList<>()。但是在那里即时发送的对象还有ArrayList类中的另一个私有Arrays类。此类与普通AbstractList一样扩展ArrayList,但不会覆盖remove方法。这是remove方法的原始实现。

/**
 * {@inheritDoc}
 *
 * <p>This implementation always throws an
 * {@code UnsupportedOperationException}.
 *
 * @throws UnsupportedOperationException {@inheritDoc}
 * @throws IndexOutOfBoundsException     {@inheritDoc}
 */
public E remove(int index) {
    throw new UnsupportedOperationException();
}

答案 3 :(得分:1)

Arrays.asList会返回一个特殊的ArrayList对象,该对象不支持任何会修改其大小的操作。

从此方法的文档中:

  

此方法还提供了创建固定大小列表的便捷方法   初始化为包含几个元素。