2016-04-01 13 views
0

誰でも問題を解決するのに手伝ってもらえますか?以下は列挙型リストの削除問題

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

リスト()'新しいArrayListの VSは、Arrays.asList(アレイ)との差〔の –

+1

可能な重複(は、Arrays.asList(IA) )in java](http://stackoverflow.com/questions/16748030/difference-between-arrays-aslistarray-vs-new-arraylistintegerarrays-aslist) – jhamon

答えて

8

返されるリストはArrays.asList()によって返されます。これは、それがサポートする配列のサイズです。サイズ変更につながる操作はサポートされていません。add(),、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クラスです。このクラスは、通常のArrayListのようにAbstractListを拡張しますが、removeメソッドをオーバーライドしません。これは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(); 
} 
関連する問題