ArrayList中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的區別


先看聲明

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)

這就是目前我能看出來的唯一區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM