java.lang.IndexOutOfBoundsException:源不适合dest
在下面的代码中:
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)
为什么?
容量不等于大小。 您传递的大小参数只是为大小分配足够的内存。 它实际上并没有定义元素。 这实际上是Collections.copy
的一个愚蠢的要求,但它仍是一个。
Collections.copy
的关键部分JavaDocs :
目的地列表必须至less与源列表一样长。 如果时间较长,则目标列表中的其余元素不受影响。
您应该将List
传递给ArrayList
的构造函数来复制所有的List
以避免这个问题。
这是一个非常好的问题,几乎可以肯定的是,设置集合容量并不一定会分配底层对象,但是为什么只要能够:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
构造函数ArrayList(Collection<? extends E> c)
将从c
每个元素复制到新创build的实例中,从而将numbers
复制到numbersCopy
。 它与numbersCopy.addAll(numbers)
也是一样的,这是你真正需要的。
Collection.copy
要求dest
数组的大小足以保存source
数组中的所有元素。 类似的比喻是C函数memcpy
之类的。