在以下代码中:
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
我得到了一个错误:
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)
为什么?
发布于 2011-05-27 11:51:18
这是一个非常好的问题,几乎可以肯定的是,设置集合容量并不一定会分配底层对象,但为什么要这样做,而您可以这样做:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
发布于 2011-05-27 12:03:08
构造函数ArrayList(Collection<? extends E> c)
会将c
中的每个元素复制到新创建的实例中,从而将numbers
复制到numbersCopy
中。它和numbersCopy.addAll(numbers)
是一样的,这也是你真正需要的。
Collection.copy
要求dest
数组足够大,以容纳source
数组中的所有元素,这是有道理的。类似的类比是C函数memcpy
等。
发布于 2019-03-11 22:14:48
在创建一个ArrayList
以使用Collections.copy()
方法复制另一个ArrayList
时,我们需要确保目标List
包含与源List
相同数量(而不仅仅是相同大小)的值。例如,如果源ArrayList
的值为红、蓝、绿,那么目标ArrayList
也应该包含相同数量的元素,如橙色、黄色、Blue.If。如果我们创建一个与源ArrayList
大小相同的ArrayList
,则会产生OutOfBounds
异常。
https://stackoverflow.com/questions/6147650
复制相似问题