问题描述
这是来源ArrayList
:
构造函数:
public ArrayList(int initialCapacity)
{
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
}
您致电set(int, E)
:
public E set(int index, E element)
{
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
Set
电话rangeCheck(int)
:
private void rangeCheck(int index)
{
if (index >= size) {
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}
它可能很微妙,但是当您调用构造函数时,尽管初始化了anObject[]
,但您并未初始化size
。因此,从中rangeCheck
,您会得到IndexOutOfBoundsException
,因为它size
是0。因此set(int,
E)
,您可以使用add(E
e)
(在您的情况下,将e
类型添加E
到列表的末尾)来代替使用,add(1)
而这不会发生。或者,如果适合您,则可以按照另一个答案中的建议将所有元素初始化为0。
解决方法
当我做
ArrayList<Integer> arr = new ArrayList<Integer>(10);
arr.set(0,1);
Java给了我
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0,Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.set(Unknown Source)
at HelloWorld.main(HelloWorld.java:13)
有没有一种简单的方法可以预先保留ArrayList的大小,然后像数组一样立即使用索引?