【问题标题】:Enum List Removal Issue枚举列表删除问题
【发布时间】:2016-07-21 04:59:22
【问题描述】:

谁能帮我解决这个问题?

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)

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

【问题讨论】:

标签: java list enums enumeration


【解决方案1】:

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

您可以使用以下成语创建可修改大小的列表:

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

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

【讨论】:

    【解决方案2】:

    Arrays.asList 返回不可变列表的实例,不能在其上调用remove。您必须将其包装在新列表中

    new ArrayList(Arrays.asList(xx))

    【讨论】:

    • Arrays.asList() 不是一成不变的,因为您可以调用.set() 对其进行修改
    【解决方案3】:

    如果您查看Arrays 类的方法asList,您会看到返回了new ArrayList&lt;&gt;()。但是在 Arrays 类内部实例化的对象还有另一个私有 ArrayList 类。此类扩展 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();
    }
    

    【讨论】:

      【解决方案4】:

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

      来自此方法的文档:

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

      【讨论】:

      • 它确实支持修改方法,但只支持不改变大小的方法。
      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2022-01-23
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多