java.lang.IndexOutOfBoundsException: Source not fit in 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)

为什么?


答案 1

容量不等于大小。传入的 size 参数只是为大小分配足够的内存。它实际上并没有定义元素。这实际上是一个愚蠢的要求,但它仍然是一个。Collections.copy

Collections.copy JavaDocs 的关键部分:

目标列表的长度必须至少与源列表一样长。如果时间较长,则目标列表中的其余元素不受影响。

您只需将 传递给 的构造函数即可复制所有 构造函数,以完全避免此问题。ListArrayListList


答案 2

这是一个非常好的问题,几乎可以肯定它与设置集合容量不一定分配底层对象的事实有关,但是当您可以这样做时,为什么要这样做:

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