2016-04-01 123 views
0

任何人都可以幫我解決問題嗎?刪除Enum列表問題

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) 

請幫助 - 爲什麼發生這種情況,我還檢查哈希碼?

+1

名單()' –

+1

的[VS新的ArrayList Arrays.asList(陣列)之間的差異可能的複製(Arrays.asList(IA) )在java](http://stackoverflow.com/questions/16748030/difference-between-arrays-aslistarray-vs-new-arraylistintegerarrays-aslist) – jhamon

回答

8

Arrays.asList()返回的列表具有固定大小 - 它支持的數組大小。它不支持可能會導致大小更改的操作:add()addAll()remove(),removeAll(),retainAll(),clear()

您可以使用下面的語句來創建修改大小的列表:

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

這將創建通過從Arrays.asList()結果複製的元素初始化一個普通ArrayList

2

Arrays.asList返回不可變列表的實例,其中remove不能被調用。你必須把它包在新的列表

new ArrayList(Arrays.asList(xx))

1

Arrays.asList返回一個特殊ArrayList對象不支持將要修改它的大小進行任何操作。

從這個方法的文檔:

此方法還提供了一個方便的方法來創建一個固定大小的列表 初始化爲包含多個元素。

+2

它實際上支持修改方法,但只有那些不改變尺寸。 –

+0

是的,你是對的。 –

2

如果你看一看到Arrays類的方法asList,你會看到,返回了new ArrayList<>()。但是那個瞬間的對象是Arrays類中的另一個私人類ArrayList。該課程延伸AbstractList,與正常的ArrayList一樣,但不覆蓋remove方法。這是remove方法的原始實現。通過`Arrays.asList()返回'不支持'卸下襬臂

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