一、ArrayList內(nèi)部有3個(gè)構(gòu)造方法,分別是:
1. ArrayList(),創(chuàng)建一個(gè)大小為10的空數(shù)組。
2. ArrayList(int initialCapacity),創(chuàng)建一個(gè)容量=initialCapacity的數(shù)組。
3. ArrayList(Collection<? extends E> c),創(chuàng)建一個(gè)包含所給集合的元素的數(shù)組。
二、當(dāng)調(diào)用add()或addAll(Collection<? extends E> c)時(shí),會(huì)先檢查數(shù)組容量,不夠的話會(huì)進(jìn)行擴(kuò)容,擴(kuò)容一般擴(kuò)大到原來(lái)的1.5倍,最大擴(kuò)大到Integer.MAX_VALUE。代碼如下:
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 這里newCapacity為原來(lái)的1.5倍
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity); // hugeCapacity方法的實(shí)現(xiàn)是:newCapacity最大值為Integer.MAX_VALUE
elementData = Arrays.copyOf(elementData, newCapacity);
}
三、內(nèi)部有2個(gè)toArray()方法,分別是:
public Object[] toArray(),返回一個(gè)object數(shù)組。
public <T> T[] toArray(T[] a),返回一個(gè)特定類型的數(shù)組,使用時(shí)需手動(dòng)創(chuàng)建一個(gè)新數(shù)組作為參數(shù)傳進(jìn)去。
四、ArrayList有個(gè)的modCount成員變量,當(dāng)調(diào)用add、addAll、remove、removeAll等方法修改數(shù)組時(shí),會(huì)執(zhí)行modCount++。modCount主要用于在使用迭代器遍歷數(shù)組時(shí)檢查數(shù)組大小是否被修改,如果被修改了,就拋出ConcurrentModificationException。以下是檢查的代碼:
if (modCount != expectedModCount) { // expectedModCount是創(chuàng)建迭代器時(shí)的modCount,括號(hào)中的modCount是最新的modCount。
throw new ConcurrentModificationException();
}
五、內(nèi)部有3個(gè)迭代器類,分別是Itr,ListItr,ArrayListSpliterator。
Itr可以從前向后單向遍歷,在某個(gè)位置刪除元素。
ListItr可以雙向遍歷,在某個(gè)位置刪除增加元素。
ArrayListSpliterator是JAVA8新增的并行迭代器,內(nèi)部使用index(開(kāi)始下標(biāo))、fence(結(jié)束下標(biāo))控制遍歷的數(shù)組范圍,可以通過(guò)trySplit方法分割出另一個(gè)ArrayListSpliterator,從而把數(shù)組分成兩半,可以交給多個(gè)線程并行處理。