and*_*and 65 java collections arraylist indexoutofboundsexception
在以下代码中:
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
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)
Run Code Online (Sandbox Code Playgroud)
为什么?
pic*_*ypg 80
容量不等于大小.您传入的size参数只是为该大小分配了足够的内存.它实际上并没有定义元素.这实际上是一种愚蠢的要求Collections.copy,但它仍然是一个.
Collections.copyJavaDocs的关键部分:
目标列表必须至少与源列表一样长.如果它更长,则目标列表中的其余元素不受影响.
你应该只是传递List给ArrayList构造函数来复制所有的东西List以完全避免这个问题.
pax*_*blo 20
这是一个非常好的问题,它几乎肯定与设置集合容量不一定分配底层对象这一事实有关,但是为什么你这样做当你可以:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
Run Code Online (Sandbox Code Playgroud)
构造函数ArrayList(Collection<? extends E> c)会将每个元素复制c到新创建的实例中,从而复制numbers到numbersCopy. 它与numbersCopy.addAll(numbers)also相同,这正是您所需要的。
Collection.copy要求dest数组足够大以容纳source数组中的所有元素确实是有道理的。类似的类比是 C 函数memcpy等。
| 归档时间: |
|
| 查看次数: |
35606 次 |
| 最近记录: |