集合系列(1)----------ArrayList 源碼分析

1、集合(Collection):存儲對象的容器,代替數組,內部提供了很多便捷的方法,提高開發效率。

       Collection接口的所有元素是Object類。

       位於:java.util.*;

       結構如下:


2、List接口:特點:有序、有下標、可重複。

      本文章主要介紹List接口系列實現類:

      ArrayList: JDK1.2產物,操作速度快,底層數組實現,增刪慢、查詢快,線程不安全;   常用在展示層

      LinkedList:JDK1.2產物,操作速度慢,底層鏈表實現,增刪快、查詢慢,線程不安全 ;  常用在管理層

      Vector:JDK1.0  操作速度慢,底層數組實現,增刪慢、查詢快,線程安全


3、ArrryList類

1、ArrayList有兩個構造方法:




 2、add()實現:



ensureExplicitCapacity(int minCapacity)判斷是否需要擴容:


grow()方法實現擴容:


數組擴容時使用Arrays.copyOf()方法

3、get(int i)



先判斷要查找的下標是否超過實際存儲數據的數組的長度;

4、E set(int i,E value)


5、E remove(int i)


注意:移除元素時,數組容量並不減少,僅僅實際長度減少

總結:ArrayList集合默認數組長度是10;

          它是個動態的數組,動態擴容需要數組copy,擴容原來的0.5倍,數組進行刪除時,不改變其容量,

          若想改變其容量調trimToSize()  

            內部藉助於一個數組實現 Object elementDate[]

            線程不安全,可以存儲null

4、Vector

        是一個線程安全的類,但是操作效率不高,它與ArrayList的區別:可以認爲是它在每個方法前面加上了synchronized,(鎖標記)做到了同步線程安全。

        Vector擴容是擴容1倍;

5、我們如果想要ArrayList實現線程安全:

可以使用Collections類中的方法:List list = Collections.synchronizedList(new ArrayList(...));

另外,我們根據市場的調查,對一個集合的操作,讀的操作次數遠遠遠遠遠大於寫操作,

所以,我們只需提高讀操作,我們就可以說在操作效率得到了提高,

如果我們保證安全,保證效率的情況下,我們可以使用另一類:CopyOnWriteArrayList<E>()

以複製數組的方式,保證讀效率最高。

6、LinkedList底層是個雙向鏈表

可以使用Collections類中的方法:List list = Collections.synchronizedList(new LinkedList(...));

代碼分析不做分析;




發佈了49 篇原創文章 · 獲贊 14 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章