先做一个简单的示例说明问题
public static void main(String[] args) {
ArrayList arrayList = new ArrayList(5);
arrayList.set(0,1);
}
声明一个容量为5的集合,然后第一位set赋值,会引发异常
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.set(ArrayList.java:448)
at com.qi.Test.main(Test.java:15)
ArrayList有关索引的函数通常会先进行rangeCheck()检查,我们来看一下set源码
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
我们发现范围检查是通过size
变量大小来实行的,我们再来看一下以容量为参数构造ArrayList
的源码
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
我们可以发现只是创建了容量为initialCapacity
大小的数组空间,而并没有对size
变量进行更改。这里就可以找到问题所在
总结: 通过index
对ArrayList
集合类操作时,通常会对该index
进行range_check
,而该检查是对size
变量来进行操作的。通常在添加元素或删除元素时size
变化。 在创建并初始化ArrayList
对象时只是生成了一定大小的数组空间,并没有修改size
变量。 因此,我们不能够直接进行set
赋值。
网友评论