數(shù)據(jù)結(jié)構(gòu)定義
從數(shù)據(jù)結(jié)構(gòu)的角度來說贺氓,ArrayList
是線性表基于java的順序表示和實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu)中定義其是一組地址連續(xù)的存儲(chǔ)單元载绿,所以其內(nèi)部其實(shí)是數(shù)組
我們可以在順序表中隨意的獲取指定位置的數(shù)據(jù)粥诫,即遍歷讀取非常方便,在其末尾追加元素也非常方便崭庸,而且可以根據(jù)需要增長或縮短其長度怀浆。
當(dāng)然我們也可以在指定位置插入元素,但是通常不建議這樣使用
如圖所示:在n+1
長度的數(shù)組中冀自,在i處插入一個(gè)元素揉稚,我們要將i后面的所有元素全部向后移動(dòng),如果在移動(dòng)之前我們檢測熬粗,現(xiàn)有數(shù)組中的元素已滿搀玖,則先需要擴(kuò)展數(shù)組,然后在進(jìn)行移動(dòng)驻呐,最后在i
處插入元素灌诅,所以其性能并不高芳来!
接下來一點(diǎn)一滴的學(xué)習(xí)ArrayList,其中的泛型全部用Integer類型
- 屬性
/**
* ArrayList初始容量
*/
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//容器中真正用于存儲(chǔ)數(shù)據(jù)的數(shù)組
transient Object[] elementData;
// 容器中元素的個(gè)數(shù)
private int size;
- 構(gòu)造方法學(xué)習(xí)
ArrayList有三個(gè)構(gòu)造方法
ArrayList()
ArrayList(int initialCapacity)
ArrayList(Collection<? extends E> c)
1.無形參的構(gòu)造方法使用
ArrayList<Integer> list = new ArrayList<Integer>();
源碼解析
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
當(dāng)使用無形參的構(gòu)造方法初始化ArrayList對(duì)象時(shí)猜拾,將靜態(tài)屬性DEFAULTCAPACITY_EMPTY_ELEMENTDATA
賦值給緩存數(shù)組
2.指定初始容量的構(gòu)造方法使用
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為容器的初始容量即舌,當(dāng)前初始容量initialCapacity大于0時(shí),創(chuàng)建一個(gè)長度為初始容量initialCapacity的Object數(shù)組挎袜,賦值給緩存數(shù)組elementData顽聂,如果初始容量為0,則將靜態(tài)屬性EMPTY_ELEMENTDATA
賦值給緩存數(shù)組,初始容量小于0時(shí)盯仪,拋出異常
3.以其他容器作為參數(shù)的構(gòu)造方法
public ArrayList(Collection<? extends E> c) {
//將參數(shù)中的容器轉(zhuǎn)換為數(shù)組紊搪,賦值給elementData
elementData = c.toArray();
//在判斷條件中將elementData的長度賦值給size,修改當(dāng)前ArrayList的長度
if ((size = elementData.length) != 0) {
//轉(zhuǎn)換后全景,elementData中有元素耀石,當(dāng)元素的類型不適Object類型時(shí),將其中的元素全部拷貝到長度為size的Object數(shù)組中爸黄,并將最后結(jié)果賦值給elementData
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
//形參轉(zhuǎn)換為數(shù)組后滞伟,數(shù)組中沒有元素,則將EMPTY_ELEMENTDATA賦值給elementData炕贵,使得elementData仍然是一個(gè)空的Object數(shù)組
this.elementData = EMPTY_ELEMENTDATA;
}
}