枚举列表删除问题
Enum List Removal Issue
谁能帮我解决这个问题?
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)
请帮忙 - 为什么会这样,我也检查了哈希码?
Arrays.asList()
返回的列表具有固定大小——支持它的数组的大小。它不支持可能导致大小变化的操作:add()
、addAll()
、remove()
、removeAll()
、retainAll()
、clear()
.
您可以使用以下习惯用法来创建可修改大小的列表:
List<TestEnum> = new ArrayList<>(Arrays.asList(xx));
这将创建一个普通的 ArrayList
,由从 Arrays.asList()
.
的结果复制的元素初始化
Arrays.asList
returns 不可变列表的实例,无法在其上调用 remove
。您必须将其包装在新列表中
new ArrayList(Arrays.asList(xx))
Arrays.asList
returns 一个特殊的 ArrayList
对象,它不支持任何会修改其大小的操作。
来自该方法的文档:
This method also provides a convenient way to create a fixed-size list
initialized to contain several elements.
如果您查看 Arrays
class 的方法 asList
,您会发现返回了 new ArrayList<>()
。但是实例化的对象是 Arrays
class 内部的另一个私有 ArrayList
class。 class 像普通的 ArrayList
一样扩展了 AbstractList
,但它不会覆盖 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();
}
谁能帮我解决这个问题?
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)
请帮忙 - 为什么会这样,我也检查了哈希码?
Arrays.asList()
返回的列表具有固定大小——支持它的数组的大小。它不支持可能导致大小变化的操作:add()
、addAll()
、remove()
、removeAll()
、retainAll()
、clear()
.
您可以使用以下习惯用法来创建可修改大小的列表:
List<TestEnum> = new ArrayList<>(Arrays.asList(xx));
这将创建一个普通的 ArrayList
,由从 Arrays.asList()
.
Arrays.asList
returns 不可变列表的实例,无法在其上调用 remove
。您必须将其包装在新列表中
new ArrayList(Arrays.asList(xx))
Arrays.asList
returns 一个特殊的 ArrayList
对象,它不支持任何会修改其大小的操作。
来自该方法的文档:
This method also provides a convenient way to create a fixed-size list initialized to contain several elements.
如果您查看 Arrays
class 的方法 asList
,您会发现返回了 new ArrayList<>()
。但是实例化的对象是 Arrays
class 内部的另一个私有 ArrayList
class。 class 像普通的 ArrayList
一样扩展了 AbstractList
,但它不会覆盖 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();
}