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

hi.addAll(are); 

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

AusgabeCopiesList.addAll Methode löst 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) 

Ich denke AbstractList.add() keine Umsetzung in JDK. Deshalb funktioniert es nicht.

Aber wenn ich ein neues ArrayList-Objekt mit einem CopiesList-Objekt erstellen, funktioniert es, weil es eine richtige add() - Implementierung hat.

Meine Frage ist: Warum hat CopiesList eine ordnungsgemäße Implementierung für AddAll?

Antwort

5

Collections.nCopies gibt eine unveränderliche List, so dass Sie nicht etwas hinzufügen können:

Gibt ein unveränderlich Liste, die aus n Kopien des angegebenen Objekts besteht.

Es gibt eine unveränderliches List, da es nur eine einzige Referenz des Elements enthält, die Sie an den Konstruktor übergeben:

Das neu Daten zugeordnet Objekt klein ist (es einen einzigen Verweis auf die Daten enthält Objekt).

Dies wird zugunsten von Leistung und Speicheranforderungen getan - Collections.nCopies(10, "Hi") und Collections.nCopies(10000000, "Hi") die gleiche Menge an Speicherplatz belegen.

Daher wäre es sehr schwierig, es als eine veränderbare Liste zu implementieren. Wie würden Sie zum Beispiel das 10000 Element auf einen neuen Wert setzen, wenn für dieses Element kein Speicher reserviert ist?

Wenn Sie eine veränderbare Liste müssen die Kopien des gleichen Objekts enthält, müssen Sie die unveränderliche Liste zu einem gewissen wandelbar Liste Konstruktor übergeben:

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

Als JavaDoc sagt, die zurückgegebene Liste unveränderlich ist, was bedeutet, Sie können es nicht ändern:

[nCopies] Gibt eine unveränderliche Liste bestehend aus n Kopien des angegebenen Objekts.

Vielleicht haben Sie den "in Kombination mit dem List.addAll" -Teil nicht bekommen. Sie müssen eine nicht-unveränderliche Liste haben, in dem Sie alle Ihre Elemente hinzufügen:

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); 
Verwandte Themen