import java.util.*;
class A
{
private ArrayList <B> bList;
private Random generator = new Random();
A(List<B> initialList)
{
bList = new ArrayList<B> ();
int listSize = initialList.size();
bList.ensureCapacity(listSize);
for (B b : initialList)
{
int bIndex = generator.nextInt(listSize);
bList.add(bIndex , b);
}
}
}
class B
{
}
当我插入blist.add(bIndex , b);
调试后,看来ensureCapacity无法正常工作。
答案 0 :(得分:2)
查看add
方法的文档:
IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; size())
将元素放入列表中可能会导致列表出现漏洞的位置是没有意义的。
ensureCapacity
只为这么多元素腾出空间。这并不意味着他们确实存在。
通过此更改,它应该有效:
int bIndex = generator.nextInt(bList.size()+1);
答案 1 :(得分:0)
容量与大小不同。您确保新列表具有足够的内部容量用于add
调用所使用的索引,但随后您调用add
,其索引(可能且可能)大于列表的{{1 }}
答案 2 :(得分:0)
您将随机收到此错误。因为您使用随机类创建索引(bIndex)。它将在您提到的列表大小中生成索引(int bIndex = generator.nextInt(listSize))。有时它会生成大于0的随机数。那时你会得到这个错误。如果它创建0,那么它不会给出错误。
您可以使用for循环而不是foreach。
for (int i = 0; i < listSize; i++) {
B b = initialList.get(i);
bList.add(i, b);
System.out.println(bList.toString());
}