今天是週末,沒什麼事就在家裡看了一下原始碼,我習慣使用jdk1.8,所以我的**全都是基於jdk1.8,好了下面是正文,今天來說說arraylist的底層實現和源**。
首先,集合arraylist是list的實現類,list還有兩個實現類linkedlist和vector。
先說說這幾個實現類的區別吧:
1.首先在底層實現上arraylist和vector是基於陣列實現的,在源**中都維護了乙個陣列用於對陣列進行操作,linkedlist底層維護的是鍊錶;
2.類的繼承路徑不同,這裡不多說繼承路徑了;
3.arraylist執行緒不安全;其餘兩種執行緒安全
關於查詢的速度:
arraylist的查詢速度快,linkedlist的增刪改速度快;vector因為是執行緒安全的所以它的查詢速度也是很慢的;(原因在源**中解釋)
下面開始看**:
首先:arraylist提供了三個構造方法:
1.定義初始容量的集合
/**
* 定義了初始容量為10的array list
*/public arraylist()
/**
* 可以自己定義建立集合的容量**/
public arraylist(int initialcapacity) else if (initialcapacity == 0) else
}
以上就是三種arraylist的構造方法邏輯簡單,**簡明就不做解釋了,給個總結,這三個構造方法就是初始化乙個儲存資料的容器,其核心就是乙個陣列,也就是上面的elementdata。public arraylist(collection<? extends e> c) else
}
下面來看看arraylist提供的方法:
首先要先解釋下arraylist中的擴容方法:
private void ensurecapacityinternal(int mincapacity)
private static
intcalculatecapacity
(object[
] elementdata,
int mincapacity)
return mincapacity;
}
private void
ensureexplicitcapacity
(int mincapacity)
這三個方法為擴容方法,但是其核心為grow(int mincapacity),private void
grow
(int mincapacity)
擴容操作發生在像集合中新增元素
這時候會首先呼叫ensurecapacityinternal(int mincapacity) ,在這個方法裡會進行呼叫calculatecapacity(object elementdata, int mincapacity)進行判斷在進行呼叫
ensureexplicitcapacity(int mincapacity)
在calculatecapacity(object elementdata, int mincapacity)中如上面**可以看到乙個判斷條件
elementdata ==defaultcapacity_empty_elementdata
在這個方法中主要是要解決乙個問題就是確定最小容量,這麼說大家可能有點迷,說得通俗點就是判斷是不是第一次新增元素,如果是也就是說這個集合是空的那麼也就是說這個集合的核心陣列是空的,這時候就要看新增的元素個數和預設長度誰大了,誰大就取誰,不是第一次新增直接就返回新增的元素個數。
那麼好,現在就開始呼叫ensureexplicitcapacity(int mincapacity); 這個方法的作用是什麼呢,很簡單,就是判斷集合是否需要擴容,判斷的條件:
mincapacity - elementdata.length > 0
mincapacity這個變數是之前比較出的最小容量,判斷這個變數是否大於陣列長度,如果大於則需要擴容,即呼叫擴容核心方法grow(int mincapacity);
在這個方法中可以很清楚的看到,這個方法每一步在上面都有很詳細的註解,不在這裡多做解釋,現在介紹幾個核心方法。
首先新增方法,新增提供了四種:
1.這個是新增單個元素的,就是先擴容,再將元素新增至陣列中,完成新增。
2.向指定位置新增乙個元素(**解釋放在**中)public boolean add
(e e)
3.像集合中新增乙個指定集合public void
add(
int index, e element)
4.向指定位置開始加入指定集合public boolean addall
(collection<
? extends e> c)
這個方法與上面的並沒有什麼區別;public boolean addall
(int index, collection<
? extends e> c)
現在來看刪除操作:
1.首先是刪除單個元素的兩個方法:
2.刪除多個元素:public e remove
(int index)
//刪除單個物件
public boolean remove
(object o)
}else
}return false;
}
下面來看看「修改」操作public boolean removeall
(collection<
?> c)
private boolean batchremove
(collection<
?> c, boolean complement)
finally
// 引數跟當前陣列不一樣
if(w != size)
}return modified;
}
1.將指定位置替換成指定元素
public e set(int index, e element)
清空集合方法
最後是轉化為陣列方法public void
clear()
好了暫時總結到這,方法還有很多,基礎方法懂了,其實都很簡單;明天分享map類的集合;再見各位。public object[
]toarray()
public t[
]toarray
(t a)
ArrayList底層實現
modifier and type method and description boolean add e e 將指定的元素追加到此列表的末尾 void add int index,e element 在此列表中的指定位置插入指定的元素。boolean addall collection exte...
ArrayList的底層實現
1 底層是object陣列,叫做 elementdata 2 預設容量10,叫做 default capacity,不是初始容量 3 如果不指定初始容量,剛new出來的list如果沒有儲存任何物件,則容量為0,但是如果指定了初始容量,剛開始size也是為0 arraylistlist new arr...
ArrayList的底層實現原理
一 對於arraylist需要掌握的七點內容 二 原始碼分析 2.1 arraylist的建立 常見的兩種方式 liststrlist new arraylist liststrlist2 new arraylist 2 arraylist源 基本屬性 物件陣列 arraylist的底層資料結構 p...