2016-12-22 5 views
2

Unten ist der Code, den ich versucht:Warum Collections.copy-Operation auf der Größe der Liste statt der Kapazität der Liste funktioniert?

//Initialized the first list with initial capacity 2 
List<String> list1=new ArrayList<String>(2); 
list1.add("banana"); 
list1.add("apple"); 

//Initialized the second list with initial capacity 4 
List<String> list2=new ArrayList<String>(4); 

//Performing copying 
Collections.copy(list2, list1); 

Aber Kopiervorgang mit IndexOutOfBoundsOperation fehlgeschlagen.
Grund: - Quelle passt nicht in Ziel.

Frage, warum Kopiervorgang arbeitet an Größe, d. H. Keine Elemente in eine Liste? Warum funktioniert die Kapazität nicht?

+0

Die Kapazität ist nur sinnvoll für 'ArrayList's. Die Methode "Collections :: copy" muss mit allen Arten von Sammlungen arbeiten. Eine etwas andere Semantik je nach Sammlungsart wäre daher sehr verwirrend. – marstran

Antwort

4

Nach dem documentation:

Kopie

Kopiert alle der Elemente aus einer Liste in eine andere. Nach der Operation ist der Index jedes kopierten Elements in der Zielliste identisch mit seinem Index in der Quellliste. Die Zielliste muss mindestens so lang wie die Quellliste sein. Wenn es länger ist, sind die verbleibenden Elemente in der Zielliste nicht betroffen. Diese Methode wird in linearer Zeit ausgeführt.

wirft

IndexOutOfBoundsException - wenn die Zielliste zu klein ist, um die gesamte Quellliste zu enthalten. Nicht unterstützteOperationException - wenn der Listen-Iterator der Zielliste den Set-Vorgang nicht unterstützt.

Also gut ... es ist nur das gewünschte Verhalten. Wenn Sie alle Elemente einer Liste zu einer anderen hinzufügen möchten, können Sie List#addAll.

+0

Meine Frage ist warum es so ist? –

+0

@AmitBhati es ist nützlich für das Erreichen einer anderen Liste, die die gleichen Elemente in der gleichen Reihenfolge hat – xenteros

+0

Aber dann sollten Sie die andere Liste mit der gleichen Anzahl von Elementen füllen, dh in meinem Fall muss ich zwei zufällige Werte in list2, zu erreichen die Kopie von list1. –

0
public static <T> void copy(List<? super T> dest, List<? extends T> src) 

Diese Methode soll für zwei beliebige List Implementierungen arbeiten.

Was ist, wenn Sie führen Sie es mit:

List<String> l1 = Arrays.asList("a","b","c"); 
List<String> l2 = Arrays.asList("1","2"); 
Collections.copy(l1,l2); 

Collections.copy nicht add verwenden können, um die Größe von l2, zu erhöhen, da Arrays.asList eine feste Größe List zurückgibt und nicht add unterstützt. Daher muss die Größe von l2 groß genug sein, um alle Elemente von l1 zu passen.

Wenn Sie sich die Implementierung anschauen, sehen Sie, dass Collections.copyset und nicht add verwendet.

Verwandte Themen