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