ArrayList 原始碼解析

2022-03-02 10:33:12 字數 2880 閱讀 4464

一,arraylist是什麼?可以用來幹什麼?

arraylist就是陣列列表,主要用來裝載資料,當我們裝載的是基本型別的資料int,long,boolean,short,byte…的時候我們只能儲存他們對應的包裝類,它的主要底層實現是陣列object elementdata。與它類似的是linkedlist,和linkedlist相比,它的查詢和訪問元素的速度較快,但新增,刪除的速度較慢。

優點:arraylist底層是用陣列實現的儲存。

特點:查詢效率高,增刪效率低,執行緒不安全。使用頻率很高。

二,實現

arraylist有三個構造方法,可以在初始化的時候指定底層陣列的大小。

通過無參構造方法的方式arraylist()初始化,則賦值底層數object elementdata為乙個預設空陣列object defaultcapacity_empty_elementdata = {}所以陣列容量為0,只有真正對資料進行新增add時,才分配預設default_capacity = 10的初始容量。

大家可以分別看下他的無參構造器和有參構造器,無參就是預設大小,有參會判斷引數。

arraylist底層是陣列實現的,陣列是有大小限制的,而arraylist是可以存放任意數量物件,具體是通過陣列的擴容來實現的。

由上面構造方法得出,如果傳入了了初始值大小,那就是使用傳入大小,如果為傳入,就是空陣列,在呼叫add方法容量會初始化為10。

在擴容的時候,1.8是如下,直接通過右移一位實現,擴容為3/2

指定位置新增,校驗規則很簡單,基本就是陣列的copy

體圖例如下:

比如有下面這樣乙個陣列我需要在index 5的位置去新增乙個元素a

那從**裡面我們可以看到,他複製了乙個陣列,是從index 5的位置開始的,然後把它放在了index 5+1的位置

給我們要新增的元素騰出了位置,然後在index的位置放入元素a就完成了新增的操作了

由上得出,插入的位置之後所有的原素都需要重新複製,如果在牽扯到擴容,效率會比較慢

arraylist刪除陣列

有下面原始碼得知,刪除其實也是陣列的複製,和上面新增類似,刪除是把後面的元素都複製一遍,效率比較慢

三、arraylist常用的方法總結

boolean add(e e)

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

void add(int index, e element)

將指定的元素插入此列表中的指定位置。

boolean addall(collection c)

按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素新增到此列表的尾部。

boolean addall(int index, collection c)

從指定的位置開始,將指定 collection 中的所有元素插入到此列表中。

void clear()

移除此列表中的所有元素。

object clone()

返回此 arraylist 例項的淺表副本。

boolean contains(object o)

如果此列表中包含指定的元素,則返回 true。

void ensurecapacity(int mincapacity)

如有必要,增加此 arraylist 例項的容量,以確保它至少能夠容納最小容量引數所指定的元素數。

e get(int index)

返回此列表中指定位置上的元素。

int indexof(object o)

返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。

boolean isempty()

如果此列表中沒有元素,則返回 true

int lastindexof(object o)

返回此列表中最後一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。

e remove(int index)

移除此列表中指定位置上的元素。

boolean remove(object o)

移除此列表中首次出現的指定元素(如果存在)。

protected void removerange(int fromindex, int toindex)

移除列表中索引在 fromindex(包括)和 toindex(不包括)之間的所有元素。

e set(int index, e element)

用指定的元素替代此列表中指定位置上的元素。

int size()

返回此列表中的元素數。

object toarray()

按適當順序(從第乙個到最後乙個元素)返回包含此列表中所有元素的陣列。

t toarray(t a)

按適當順序(從第乙個到最後乙個元素)返回包含此列表中所有元素的陣列;返回陣列的執行時型別是指定陣列的執行時型別。

void trimtosize()

將此 arraylist 例項的容量調整為列表的當前大小。

ArrayList原始碼解析

new arraylist public arraylist public arraylist int initialcapacity else if initialcapacity 0 else private static final object defaultcapacity empty e...

ArrayList原始碼解析

arraylist內部的結構採用的是陣列。transient object elementdata non private to simplify nested class access當我們使用預設建構函式的時候,如下 private static final object defaultcapa...

ArrayList 原始碼解析

從日常 看arraylist的執行流程 第一步 我們初始化乙個 arraylist 然後新增乙個元素,如下 public class arraylisttest arraylist的建構函式和方法有三個,乙個是帶有初始大小的arraylist,乙個傳入collection,另外乙個空參。我們呼叫空參...