一直要總結(jié)java集合中的知識,不知道應(yīng)該如何下筆。覺得集合太多東西了,寫細(xì)了太難了,寫粗了又感覺寫不好。不管如何覺得還是要堅持的寫一寫基礎(chǔ)這一類的東西,為了提高自己的編程基礎(chǔ)。本來覺的自己對這些已經(jīng)很熟悉,最近見過一些大神后發(fā)現(xiàn)差距太大了,瞬間懵了,只能在加強學(xué)習(xí)了。
一、ArrayList是什么?
ArrayList是實現(xiàn)List接口的動態(tài)數(shù)組,所謂動態(tài)是指它的大小是可變的。實現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。除了實現(xiàn) List 接口外,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。
既然是數(shù)組,肯定就有容量。每個ArrayList對象都有一個容量,該容量是用來表示可以存放多少個數(shù)據(jù)在里面,即是數(shù)組的大?。J(rèn)是10)。當(dāng)然,動態(tài)的肯定就會自動增加,每次我們往里面添加數(shù)據(jù)的時候,它都會進(jìn)行擴容檢查,檢查完擴容會擴大為原來的1.5倍,擴容操作帶來數(shù)據(jù)向新數(shù)組的重新拷貝,影響性能,所以如果我們知道具體業(yè)務(wù)數(shù)據(jù)量,在構(gòu)造ArrayList時可以給ArrayList指定一個初始容量,這樣就會減少擴容時數(shù)據(jù)的拷貝問題。當(dāng)然在添加大量元素前,應(yīng)用程序也可以使用ensureCapacity操作來增加ArrayList實例的容量,這可以減少遞增式再分配的數(shù)量。
ArrayList的底層實現(xiàn)是不同步,多線程操作會出現(xiàn)問題,這一點大家要注意??梢圆迦胫貜?fù)數(shù)據(jù),可以插入Null。
二、ArrayList源碼分析
2.1、ArrayList定義
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList的定義,繼承AbstractList,實現(xiàn)List<E>, RandomAccess, Cloneable, java.io.Serializable,其中AbstractList實現(xiàn)了 List 的一些位置相關(guān)操作(比如 get,set,add,remove),是第一個實現(xiàn)隨機訪問方法的集合類,但不支持添加和替換。RandomAccess代表該類是否支持 隨機訪問,Cloneable類支持克隆,Serializable支持序列化。
2.2、底層使用數(shù)組
private static final long serialVersionUID = 8683452581122892189L;//serialVersionUID作用是序列化時保持版本的兼容性,即在版本升級時反序列化仍保持對象的唯一性。
private transient Object[] elementData;//Object數(shù)組,transient關(guān)鍵字不知道的同學(xué)自己查資料去,帶transient關(guān)鍵字的變量不會序列化。ArrayList容器,基本操作都是基于該數(shù)組進(jìn)行操作的。
private int size;//數(shù)組的大小。
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//要分