java arraylist collections indexoutofboundsexception

java.lang.IndexOutOfBoundsException: la fuente no cabe en dest



arraylist collections (3)

En el siguiente código:

static void findSubsets (ArrayList<Integer> numbers, int amount, int index) { ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size()); Collections.copy(numbersCopy, numbers); }

Me aparece el error:

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)

¿Por qué?


El constructor ArrayList(Collection<? extends E> c) copiará todos los elementos de c en la instancia recién creada, y numbersCopy numbers en numbersCopy . Es lo mismo que numbersCopy.addAll(numbers) también, que es realmente lo que necesita.

Tiene sentido que Collection.copy requiera que la matriz de dest sea ​​lo suficientemente grande como para contener todos los elementos de la matriz de source . Una analogía similar es la función C memcpy y similares.


Esa es una muy buena pregunta y casi con seguridad tiene que ver con el hecho de que establecer una capacidad de recopilación no necesariamente asigna los objetos subyacentes, pero ¿por qué lo haces de esa manera cuando puedes simplemente:

ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);


La capacidad no es igual al tamaño. El parámetro de tamaño que está pasando simplemente asigna suficiente memoria para el tamaño. En realidad, no define elementos. En realidad, es un requisito tonto de Collections.copy , pero es uno de todos modos.

La parte clave de Collections.copy JavaDocs :

La lista de destinos debe ser al menos tan larga como la lista fuente. Si es más largo, los elementos restantes en la lista de destinos no se verán afectados.

Simplemente debe pasar la List al constructor ArrayList para copiar toda la List para evitar el problema por completo.