Auf dem folgenden Code:
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
Ich erhalte den Fehler:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
at java.util.Collections.copy(Collections.java:548)
at backtracking2.Main.findSubsets(Main.java:61)
Warum?
java
arraylist
collections
indexoutofboundsexception
andandandand
quelle
quelle
toArray
und erstellt wirdArrays.copyOf
. Änderungen, die an einer der folgenden Listen vorgenommen werden, wirkennumbersCopy = new ArrayList<Integer>(numbers)
sich nicht auf die andere aus. Das würde sicherlich den Zweck des Konstruktors zunichte machen (und es braucht einCollection
undList
sowieso kein ).Collections.copy
auch keine Leistung erbringt .Integer
in dieser Frage) gibt es jedoch keinen Funktionsunterschied zwischen einer flachen und einer tiefen Kopie.Das ist eine sehr gute Frage und hat mit ziemlicher Sicherheit damit zu tun, dass beim Festlegen einer Sammlungskapazität nicht unbedingt die zugrunde liegenden Objekte zugewiesen werden. Warum tun Sie dies jedoch so, wenn Sie nur:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
quelle
Arrays.copyOf()
dass es sich um eine nicht referenzierte Kopie handeltInteger
es unveränderlich ist.Der Konstruktor
ArrayList(Collection<? extends E> c)
kopiert alle Elemente ausc
in die neu erstellte Instanz und kopiert sienumbers
innumbersCopy
. Es ist das gleiche wienumbersCopy.addAll(numbers)
auch, was wirklich das ist, was Sie brauchen.Es ist sinnvoll,
Collection.copy
dass dasdest
Array groß genug sein muss, um alle Elemente dessource
Arrays aufzunehmen. Eine ähnliche Analogie ist die C-Funktionmemcpy
und dergleichen.quelle
Während eines Erstellen einer
ArrayList
andere kopieren ,ArrayList
indemCollections.copy()
Methode, müssen wir sicherstellen , dass das ZielList
gleiche Anzahl von Werten (nicht nur gleiche Größe) als Quelle enthältList
. Wenn die Quelle beispielsweiseArrayList
die Werte [Rot, Blau, Grün] hat, sollte das ZielArrayList
auch die gleiche Anzahl von Elementen wie [Orange, Gelb, Blau] enthalten. Wenn wir ein ElementArrayList
mit der gleichen Größe wie die Quelle erstellenArrayList
, gibt es eineOutOfBounds
Ausnahme.quelle
Sie können auch Collections.add verwenden. Angenommen, wir müssen List1 nach List2 kopieren.
List2.addAll(List1);
Hier werden die Dateien hinzugefügt. Wenn Sie dies effizienter wünschen, müssen Sie die Liste2 löschen, bevor Sie die Elemente von list1 wie folgt hinzufügen.list2.clear();
quelle
In Java 8 +
In Java 10+ ist es einfacher
Liste
.copyOf()
gibt eineunmodifiable
Liste zurück, die die Elemente der angegebenen Sammlung enthält.quelle