2017-11-02 10 views
3
List<String> hi = Collections.nCopies(10, "Hi"); 
List<String> are = Collections.nCopies(10, "Are"); 

hi.addAll(are); 

hi.forEach(System.out::println); 

出力CopiesList.addAllメソッドはUnsupportedOperationException

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(Unknown Source) 
    at java.util.AbstractList.add(Unknown Source) 
    at java.util.AbstractCollection.addAll(Unknown Source) 
    at com.practice.java8.lambdaexp.Test.main(Test.java:14) 

を投げる私はAbstractList.addは()JDKに実装を持っていないと思います。それが働いていない理由です。

しかし、CopiesListオブジェクトを使用して新しいArrayListオブジェクトを作成すると、それは適切なadd()実装を持つため動作します。

私の質問です:なぜCopiesListはaddAllのための適切な実装を持っていませんか? JavaDocとして

答えて

5

Collections.nCopiesあなたがそれに何かを追加することはできませんので、不変Listを返します。

不変を返します。リストは、指定されたオブジェクトのn個のコピーで構成されます。

それだけであなたがそのコンストラクタに渡す要素の単一の参照が含まれているので、それは不変Listを返します。

新しく割り当てられたデータオブジェクトは極小である(それはデータへの単一の参照が含まれていますオブジェクト)。

これは、パフォーマンスと記憶域要件のために行われます。Collections.nCopies(10, "Hi")Collections.nCopies(10000000, "Hi")は、同じ容量の領域を占有します。

したがって、変更可能リストとして実装することは非常に困難です。その要素に割り当てられた記憶域がない場合、たとえば、10000の要素に新しい値を設定するとどうでしょうか?

あなたが同じオブジェクトのコピーを含む変更可能なリストが必要な場合は、あなたには、いくつかの変更可能なリストのコンストラクタに不変のリストを渡すことがあります。

List<String> mutable = new ArrayList<>(Collections.nCopies(10, "Hi")); 
4

は、返されたリストは、あなたがそれを変更することはできませんを意味し、不変で、こう述べています。

[NCOPIES]指定されたオブジェクトのn個のコピーで構成される不変のリストを返します。

「List.addAll」と組み合わせて使用​​していない可能性があります。あなたはすべてのあなたの要素を追加することが可能な非不変のリストを持っている必要があります。

List modifiableList = new ArrayList<String>(); 

List<String> hi = Collections.nCopies(10, "Hi"); 
List<String> are = Collections.nCopies(10, "Are"); 

modifiableList.addAll(are); 
modifiableList.addAll(hi); 

modifiableList.forEach(System.out::println); 
関連する問題