1. 底層存儲(chǔ)
private transient Object[] elementData;
private int size;
elementData 成員加上了transient關(guān)鍵字,該關(guān)鍵是在該類被序列化和反序列化的時(shí)候不參與,這是因?yàn)榇娣舉lementData是固定數(shù)組,防止沒有存放元素的數(shù)組位置也被序列化,所以使用的自定義的序列化方法。
2. 構(gòu)造方法
夠著方法提供了兩個(gè),一個(gè)默認(rèn)大小為10的數(shù)組,另一個(gè)可以指定大小的數(shù)組
3. 增加和刪除
每次添加元素的時(shí)候都會(huì)檢查容量是否足夠,如果不夠會(huì)擴(kuò)容,擴(kuò)容會(huì)擴(kuò)大原來(lái)的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
刪除不進(jìn)行縮容,如果數(shù)組進(jìn)行一次大的擴(kuò)容后,后續(xù)只使用了幾個(gè)空間,可以使用
/**
* 將底層數(shù)組的容量調(diào)整為當(dāng)前實(shí)際元素的大小,來(lái)釋放空間。
*/
public void trimToSize() {
modCount++;
// 當(dāng)前數(shù)組的容量
int oldCapacity = elementData .length;
// 如果當(dāng)前實(shí)際元素大小 小于 當(dāng)前數(shù)組的容量,則進(jìn)行縮容
if (size < oldCapacity) {
elementData = Arrays.copyOf( elementData, size );
}
來(lái)縮小容量
4. 總結(jié)
ArrayList內(nèi)部采用固定數(shù)組來(lái)存儲(chǔ)對(duì)象的引用,當(dāng)增加到固定數(shù)組以外時(shí),需要對(duì)數(shù)組進(jìn)行擴(kuò)容,新申請(qǐng)一塊原來(lái)1.5倍大小的內(nèi)存,把原來(lái)的數(shù)組拷貝的新申請(qǐng)的數(shù)組內(nèi)。由此可得,當(dāng)在頻繁增加的場(chǎng)景中,最好一次性的申請(qǐng)足夠大的數(shù)組容量,以免頻繁擴(kuò)容帶來(lái)的時(shí)間開銷。