ArrayList源碼解讀一之構造器

###1.ArrayList中的變量

在我們看構造器源碼時候前,先了解一下ArrayList的變量:

<code>        private static final int DEFAULT_CAPACITY = 10;//默認容量為10
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//默認數組
transient Object[] elementData;//存儲數據的數組
private int size;//記錄ArrayList的大小/<code>

###2.ArrayList中構造器

####(一)無參構造器

<code>    public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}/<code>

當我們不傳參數的時候,elementData默認指向DEFAULTCAPACITY_EMPTY_ELEMENTDATA數組的,此時此刻elementData其實還是空數據,大小為0。

####(二)有參構造器

<code>    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);
}
}/<code>

我們可以看到,當我們傳入參數的時候:構造器會判斷initialCapacity的值

- 當大於0的情況會幫我們創建新的數組。

- 當等於0的情況會幫我指向EMPTY_ELEMENTDATA空數組,此時此刻也是和無參構造器相同,elementData還是空數據,大小為0。

- 其餘情況(initialCapacity<0)會幫我們拋出異常。

####(三) 有參構造器

<code>    public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}/<code>

從代碼中可以看到,ArrayList函數參數類型是繼承泛型的對象通過進行調用toArray()將對象轉換成數組指向elementData。

- 當它的大小不能等於0的情況且它的類與Object不相等的時候,進行類型轉換成Oject類型。

- 其餘情況(size == 0)它會指向空的數組。

結論:

- 當它不傳參數、傳入參數為0 或者傳進去對象大小為0的時候,它都會指向空數組、大小為0。

- 當它傳入參數不為0,它會創建新的數組。

- 當它傳入對象大小不為0時候,它會將對象進行轉換數組以及對象類型也轉換成Object類型。

**最後,有什麼不對的地方,請各位大神指出。**


分享到:


相關文章: