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之类的。