先做一個簡單的示例說明問題
public static void main(String[] args) {
ArrayList arrayList = new ArrayList(5);
arrayList.set(0,1);
}
聲明一個容量為5的集合惫谤,然后第一位set賦值霍骄,會引發(fā)異常
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有關索引的函數(shù)通常會先進行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));
}
我們發(fā)現(xiàn)范圍檢查是通過size
變量大小來實行的蹬敲,我們再來看一下以容量為參數(shù)構造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);
}
}
我們可以發(fā)現(xiàn)只是創(chuàng)建了容量為initialCapacity
大小的數(shù)組空間赋荆,而并沒有對size
變量進行更改。這里就可以找到問題所在
總結(jié): 通過index
對ArrayList
集合類操作時尝抖,通常會對該index
進行range_check
毡们,而該檢查是對size
變量來進行操作的。通常在添加元素或刪除元素時size
變化昧辽。 在創(chuàng)建并初始化ArrayList
對象時只是生成了一定大小的數(shù)組空間衙熔,并沒有修改size
變量。 因此搅荞,我們不能夠直接進行set
賦值红氯。