ArrayList 的實現原理

2021-10-11 22:44:22 字數 3339 閱讀 2116

arraylist是list介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 list 介面外,此類還提供一些方法來操作內部用來儲存列表的數 組的大小。 每個arraylist 例項都有乙個容量,該容量是指用來儲存列表元素的陣列的大小。它總是大於等於列表的大小。隨著向arraylist 中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,因此,如果可預知資料量的多少,可在構造 arraylist 時 指定其容量。

注意,此實現不是同步的。如果多個執行緒同時訪問乙個 arraylist 例項,而其中至少乙個執行緒從結構上修改了列表,那麼它必須保持外部同步。 相對比的,vector是執行緒安全的,其中涉及執行緒安全的方法皆被同步操作了。即使如此我們也不建議使用vector,而是使用collections工具類提供的synchronizedlist(list list)將arraylist轉換為執行緒安全的。

對於arraylist 而言,它實現 list 介面、底層使用陣列儲存所有元素。其操作基本上是對陣列的操作。下面我們來分析 arraylist 的源**:

1、底層使用陣列實現

private

static

final object[

] defaultcapacity_empty_elementdata =

;

2、構造器

arraylist 提供了三種方式的構造器:

可以構造乙個預設初始容量為 10 的空列表(在新增第乙個元素的時候預設初始化容量為10,而不是再建立物件的時候就初始化容量為10,,jdk1.7建立物件的時候就會預設初始化建立容量為10 的陣列)

構造乙個指定初始容量的空列表

構造乙個包含指定 collection 的元素的列表

這些元素按照 該 collection 的迭代器返回它們的順序排列的。

private

static

final object[

] defaultcapacity_empty_elementdata =

;public

arraylist()

private

static

final object[

] empty_elementdata =

;public

arraylist

(int initialcapacity)

else

if(initialcapacity ==0)

else

}public

arraylist

(collection<

?extends

e> c)

else

}

3、儲存

arraylist 提供了 set(int index, e element)、add(e e)、add(int index, e element)、addall(collection<? extends e> c)、addall(int index, collection<? extends e> c)這些新增元素的方法。

add(e e)方法詳解:

// 將指定的元素新增到此列表的尾部

public

boolean

add(e e)

private

void

ensurecapacityinternal

(int mincapacity)

private

static

final

int default_capacity =10;

// elementdata == defaultcapacity_empty_elementdata 判斷elementdata 是否為空

// 如果為空則此次新增元素是第一次新增元素,返回default_capacity

// 否則返回mincapacity

private

static

intcalculatecapacity

(object[

] elementdata,

int mincapacity)

return mincapacity;

}// mincapacity - elementdata.length > 0

// 如果增加乙個元素後的容量比現有的容量大,則使用grow進行擴容

private

void

ensureexplicitcapacity

(int mincapacity)

// 擴容方法

private

void

grow

(int mincapacity)

從上述**中可以看出,陣列進行擴容時,會將老陣列中的元素重新拷貝乙份到新的陣列中,每次陣列容量的增長是其原容量的 1.5 倍。這種操作的代價是很高的,因此在實際使用時,我們應該盡量避免陣列容量的擴張。當我們可預知要儲存的元素的多少時, 要在構造 arraylist 例項時,就指定其容量,以避免陣列擴容的發生。

4、讀取
// 返回此列表中指定位置上的元素。

public e get

(int index)

e elementdata

(int index)

5、刪除

arraylist 提供了根據下標或者指定物件兩種方式的刪除功能

// 根據陣列下標進行刪除

public e remove

(int index)

// 根據物件進行刪除

public

boolean

remove

(object o)

}else

}return

false

;}

3.1、arraylist的原始碼分析:

3.1.1 jdk 7情況下

3.2.2 jdk 8中arraylist的變化:

3.2.3 小結:

jdk7中的arraylist的物件的建立類似於單例的餓漢式, 而jdk8中的arraylist的物件的建立類似於單例的懶漢式,延遲了陣列的建立,節省記憶體。

3.2、linkedlist的原始碼分析:

3.3、vector的原始碼分析:

jdk7和jdk8中通過vector()構造器建立物件時,底層都建立了長度為10的陣列。在擴容方面,預設擴容為原來的陣列長度的2倍。

ArrayList的實現原理

arraylist是list介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 list 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。每個 arraylist 例項都有乙個容量,該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列表的大...

ArrayList的底層實現原理

一 對於arraylist需要掌握的七點內容 二 原始碼分析 2.1 arraylist的建立 常見的兩種方式 liststrlist new arraylist liststrlist2 new arraylist 2 arraylist源 基本屬性 物件陣列 arraylist的底層資料結構 p...

ArrayList的實現原理詳解

1.arraylist概述 arraylist是list介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 list 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。每個arraylist例項都有乙個容量,該容量是指用來儲存列表元素的陣列的大小...