數據結構定義
從數據結構的角度來說,ArrayList
是線性表基于java的順序表示和實現,數據結構中定義其是一組地址連續的存儲單元,所以其內部其實是數組
我們可以在順序表中隨意的獲取指定位置的數據,即遍歷讀取非常方便,在其末尾追加元素也非常方便,而且可以根據需要增長或縮短其長度。
當然我們也可以在指定位置插入元素,但是通常不建議這樣使用
插入元素
如圖所示:在n+1
長度的數組中,在i處插入一個元素,我們要將i后面的所有元素全部向后移動,如果在移動之前我們檢測,現有數組中的元素已滿,則先需要擴展數組,然后在進行移動,最后在i
處插入元素,所以其性能并不高!
接下來一點一滴的學習ArrayList,其中的泛型全部用Integer類型
- 屬性
/**
* ArrayList初始容量
*/
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//容器中真正用于存儲數據的數組
transient Object[] elementData;
// 容器中元素的個數
private int size;
- 構造方法學習
ArrayList有三個構造方法
ArrayList()
ArrayList(int initialCapacity)
ArrayList(Collection<? extends E> c)
1.無形參的構造方法使用
ArrayList<Integer> list = new ArrayList<Integer>();
源碼解析
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
當使用無形參的構造方法初始化ArrayList對象時,將靜態屬性DEFAULTCAPACITY_EMPTY_ELEMENTDATA
賦值給緩存數組
2.指定初始容量的構造方法使用
ArrayList<Integer> list = new ArrayList<Integer>(5);
源碼解析
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為容器的初始容量,當前初始容量initialCapacity大于0時,創建一個長度為初始容量initialCapacity的Object數組,賦值給緩存數組elementData,如果初始容量為0,則將靜態屬性EMPTY_ELEMENTDATA
賦值給緩存數組,初始容量小于0時,拋出異常
3.以其他容器作為參數的構造方法
public ArrayList(Collection<? extends E> c) {
//將參數中的容器轉換為數組,賦值給elementData
elementData = c.toArray();
//在判斷條件中將elementData的長度賦值給size,修改當前ArrayList的長度
if ((size = elementData.length) != 0) {
//轉換后,elementData中有元素,當元素的類型不適Object類型時,將其中的元素全部拷貝到長度為size的Object數組中,并將最后結果賦值給elementData
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
//形參轉換為數組后,數組中沒有元素,則將EMPTY_ELEMENTDATA賦值給elementData,使得elementData仍然是一個空的Object數組
this.elementData = EMPTY_ELEMENTDATA;
}
}