Java集合 ArrayList原始碼

2021-09-10 23:34:05 字數 3830 閱讀 5587

一、arraylist資料結構

arraylist底層是陣列實現的,陣列元素的型別是object型別,可以動態的增長和縮減。

arraylist先繼承abstractlist,abstractlist實現list介面

二、arraylist的屬性

//版本號

private static final long serialversionuid = 8683452581122892189l;

//初始化預設值

private static final int default_capacity = 10;

//指定arraylist容量為10時,返回該空物件陣列

private static final object empty_elementdata = {};

//呼叫無參構造方法時,返回該空物件陣列。它與empty_elementdata最大的區別是:該陣列是預設返回的,而empty_elementdata是使用者指定容量為0時返回的

private static final object defaultcapacity_empty_elementdata = {};

//儲存元素陣列

transient object elementdata;

//元素大小

private int size;

//最大陣列容量

private static final int max_array_size = integer.max_value - 8;

三、構造方法

arraylist有三個構造方法

(1)arraylistint (int initialcapacity)

/*指定乙個初始容量為initialcapacity的空arraylist*/

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}

(2)arraylist()

/* 構造乙個初始容量為 10 的空列表 */

public arraylist()

(3)arraylist(collection<? extends e> c)

/*構造乙個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的*/

public arraylist(collection<? extends e> c) else

}

四、核心方法

(1)add(e e):將元素新增到列表的尾部

public boolean add(e e) 

//陣列容量檢查,不夠時進行擴容,mincapacity為需要的最小容量

public void ensurecapacity(int mincapacity)

}//陣列容量檢查,不夠時進行擴容

private void ensurecapacityinternal(int mincapacity)

ensureexplicitcapacity(mincapacity); }

//陣列容量檢查,不夠時擴容

private void ensureexplicitcapacity(int mincapacity)

//擴容

private void grow(int mincapacity)

//進行大容量分配

private static int hugecapacity(int mincapacity)

總結:

add(e e)方法進行擴容的步驟:

①先進行空間檢查,看是否需要擴容,若需要擴容,確定最少需要擴容的容量

②確定擴容後,執行grow(int mincapacity)方法,mincapacity為最小需要擴容的容量

③第一次擴容, newcapacity = oldcapacity + (oldcapacity >> 1);在原有容量基礎上增加一半

④第一次擴容後,判斷容量是否還小於需要的最小擴容容量mincapacity,若還小於,將容量擴充為mincapacity

⑤對擴容後的容量進行判斷,如果擴容後的容量大於最大的臨界值,則進行大容量分配。如果需要的容量大於max_array_size,分配 integer.max_value 否則分配max_array_size

(2)add(int index,e element):在指定位置新增元素

public void add(int index, e element) 

//越界檢查

private void rangecheckforadd(int index)

總結:

①越界檢查,若越界丟擲異常

②確定容量,判斷容量是否足夠,不夠進行擴容

③移動元素,騰出需要插入元素的空間,插入元素

(3)remove(int index):刪除指定位置的元素

public e remove(int index)
總結:

刪除指定位置的元素:

①越界檢查,若越界丟擲異常

②計算需要移動的元素個數,元素個數大於0,則需要把要刪除元素之後的所有元素向左移動,覆蓋掉要刪除的元素

③刪除的元素賦值為null

4)remove(object 0):移除此列表中首次出現的指定元素

public boolean remove(object o) 

} else

}return false;

}private void fastremove(int index)

(5)set(int index,e element):用指定的元素替代此列表中指定位置上的元素

public e set(int index, e element)
(6)get(int index):返回此列表中指定位置上的元素

public e get(int index) 

//返回索引為index的元素

e elementdata(int index)

總結:

arraylist底層本質是elementdata陣列,在資料的查詢方面會很快,但是在增加、刪除方面相對慢點,因為有可能需要移動大量的元素。arraylist初始容量為10,根據需求會進行相應的擴容。

arraylist和vector的區別:

①arraylist是執行緒不安全的,vector是執行緒安全的(synchronized),當多條執行緒訪問同乙個arraylist集合時,需要手動保證該集合的同步性,而vector則不用。

②arraylist和vector都採用線性連續儲存空間,當儲存空間不足的時候,arraylist預設增加為原來的50%(newcapacity = oldcapacity + (oldcapacity >> 1)),vector預設增加為原來的一倍(newcapacity = oldcapacity + ((capacityincrement > 0) ?

capacityincrement : oldcapacity))

Java集合 ArrayList集合

以陣列實現。節約空間,但是陣列有容量限制。超出限制時會增加50 容量,用system.arraycopy 複製到新的陣列,因此最好能給出陣列大小的預估值。預設第一次插入元素時建立大小為10 的陣列。按照陣列下標來訪問元素 get i set i,e 的效能很高,這是陣列的基本優勢。直接在陣列末尾加入...

Java基礎 集合ArrayList

集合類 物件導向類,對事物的描述都是通過物件實現。為方便對多個物件進行操作,必須對多個物件進行儲存,因此需要容器類。容器類特點是長度可變。stringbuilder只能存放字串。int等陣列雖能存放自定義型別,但長度固定。arraylist是一種特殊的資料型別,泛型。arraylist 構造乙個初始...

Java學習筆記 集合Arraylist

arraylist集合 arraylist list new arraylist 可以使object型也可以是類。通過例子說明arraylist的使用方法 arraylist list new arraylist list.add i 向list中新增乙個值object型的i值,list.add i...