先看聲明
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
除了名字完全一樣,還都被static final修飾了
那為什么需要兩個一樣的呢?
其實要看在剛剛創建的一個ArrayList中添加元素會發生什么
這里有兩種創建方式:
ArrayList list1= new ArrayList(0);
ArrayList list2= new 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
為0時,elementData
被賦值為EMPTY_ELEMENTDATA
第二種構造函數是這么寫的:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
elementData
直接被賦值為DEFAULTCAPACITY_EMPTY_ELEMENTDATA
接下來,我們來看添加元素的操作
list1.add(1);
數組是空的,肯定不夠
於是便要擴容,在擴容之前,有一個確定增長后的數組大小的函數
之前的源碼不貼了,無論哪種方法,來這里minCapacity都是1
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
鑒於我們只添加了一個元素,可以得出
如果使用第一個構造函數,添加一個元素后,elementData.length=1
如果使用第二個構造函數,添加一個元素后,elementData.length=10 (DEFAULT_CAPACITY就是10)
這就是目前我能看出來的唯一區別。