ArrayList是最經常使用的集合類,底層是由數組實現的java
首先能夠看到,有兩個static final對象數組,也就是被線程間共享的,EMPTY_ELEMENTDATA是非default大小的空集合,緣由是要辨別第一次添加元素時應該擴展的大小。數組
private static final Object[] EMPTY_ELEMENTDATA = {};安全
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};函數
transient Object[] elementData;這裏是存儲實際元素的對象數組,transient關鍵字表示該部份內容不能被序列化,ArrayList實際上序列化調用的是writeObject和readObject方法,而不是直接由elementData進行序列化,緣由是elementData裏面有空元素,這部分不須要進行序列化,能夠節約內存和時間。spa
private int size;是實際元素的個數線程
protected transient int modCount = 0;modCount的做用的保證線程安全,ArrayList自己是非同步的集合類,出現遍歷操做都要檢查modCount值是否改變。除了自身的set方法外,其餘全部存在對elementData寫入的操做都會增長modCount值。對象
public ArrayList(int initialCapacity)給定參數爲0時elementData直接賦值爲EMPTY_ELEMENTDATA,不然新建一個指定大小的數組排序
public ArrayList()直接賦值DEFAULTCAPACITY_EMPTY_ELEMENTDATA繼承
public ArrayList(Collection<? extends E> c)若集合c不爲空,elementData引用c.toArray產生的數組,若產生的不是Object[]須要再調用Arrays.copyOf進行復制。集合爲空則賦值爲EMPTY_ELEMENTDATA內存
public void trimToSize()經過Arrays.copyOf將elementData中的空元素去掉,若size==0則賦值爲EMPTY_ELEMENTDATA
public void ensureCapacity(int minCapacity)參數給定所需的最小大小,檢查該大小是否大於最小擴展大小(DEFAULTCAPACITY_EMPTY_ELEMENTDATA時該值爲10不然爲0),大於時調用ensureExplicitCapacity(minCapacity)對集合進行擴展,能夠手動調用
private void ensureCapacityInternal(int minCapacity)和上一個類似,add元素時檢查大小是否足夠,仍未DEFAULTCAPACITY_EMPTY_ELEMENTDATA時擴展10和minCapacity的較大值,不然直接擴展minCapacity
private void ensureExplicitCapacity(int minCapacity) minCapacity大於elementData的元素個數時,調用grow(minCapacity),不管是否增加了大小,該方法都會增長modCount
private void grow(int minCapacity)增加大小爲minCapacity和elementData.length*1.5中的較大值,最大不能超過Integer.max(2的31次)-8,經過Arrays.copyOf複製元素
public int size()返回size值
public boolean isEmpty()返回size是否爲0
public int indexOf(Object o)o爲null時檢查elementData中是否有元素==o,不然檢查是否有o.equals(x),存在則返回第一個符合的下標,不存在返回-1
public int lastIndexOf(Object o)與上一個方法相比區別在於從尾部開始遍歷,返回的是下標最大的一個
public boolean contains(Object o)調用indexOf,返回不爲-1時爲true
public Object clone()新建一個ArrayList,elementData複製過去,其餘內部變量也相同
public Object[] toArray()返回Arrays.copyOf(elementData, size),因此不含後面的空數組
public <T> T[] toArray(T[] a)若a.length<size,則新建一個包含elementData中實際對象的數組返回。不然將elementData中的元素複製給a並設a[size] = null,返回a
public E get(int index)獲取指定下標元素內容
public E set(int index, E element)將指定下標元素改成element並返回舊值
public boolean add(E e)檢查數組大小是否須要擴展後,添加元素,增長size,必定會增長modCount
public void add(int index, E element)先檢查index是否符合範圍,而後檢查數組大小是否須要擴展,將index後的元素向後複製覺得,而後elementData[index]=element,必定會增長modCount
public E remove(int index) 先檢查index是否符合範圍,而後modCount增長,index後的元素往前複製一位,elementData[size]的值爲null便於觸發gc,size減一,返回舊元素的值
public boolean remove(Object o)首先按照indexOf的邏輯尋找第一個相等的元素,若是存在則將後面的元素往復制一位最後一個元素設爲null並增長modCount返回true,不然返回false。由於index確定是符合返回的,因此調用不檢查index是否符合範圍private void fastRemove(int index)
public void clear()modCount增長,將size個元素都設爲null,size改成0
public boolean addAll(Collection<? extends E> c)經過System.arraycopy將c的元素複製到集合的後面,modCount增長,size增長c的元素個數,若新size不爲0則返回true
public boolean addAll(int index, Collection<? extends E> c)和上面相比區別在於要將c複製到從index開始的位置而不是末尾,一樣會增長modCount
protected void removeRange(int fromIndex, int toIndex)增長modCount,將toIndex後面的元素複製到fromIndex開始的位置,多餘的設爲null便於觸發GC,修改size值
public boolean removeAll(Collection<?> c)移除和c中相同的元素,若本來集合中元素個數變更增長modCount
public boolean retainAll(Collection<?> c)保留和c中相同的元素,若本來集合中元素個數變更增長modCount
private void writeObject(java.io.ObjectOutputStream s) 序列化函數,經過s.writeObject將對象寫入到輸出流中,經過檢查modCount的值是否改變來確保線程安全
private void readObject(java.io.ObjectInputStream s)序列化函數,經過s.readObject()將輸入流中的對象讀取到elementData中
public Iterator<E> iterator()返回一個實現的迭代器,只能從頭向尾移動,移動時元素個數不能被其餘線程改變。能夠移除和forEachRemaining (Consumer<? super E> consumer)進行批量操做,批量操做時modCount不能被其餘線程改變
public ListIterator<E> listIterator(int index)返回一個從指定下標開始的列表迭代器是Iterator<E>的繼承類,若不輸入參數默認從0開始。能夠先後移動,移動時檢查元素個數不能被其餘線程修改。額外提供了set和add方法。
public List<E> subList(int fromIndex, int toIndex)返回一個子集合,對子集合的add remove set操做會改變parent對應的元素,並改變二者的modCount值。subList爲抽象類,自己並無elementData區域,對他元素的操做會直接操做在parent的elementData上
public boolean removeIf(Predicate<? super E> filter)根據過濾器filter移除符合的元素,整個過程要求modCount不能被其餘線程改變,先用一個BitSet存儲要刪除的序號,而後經過removeSet.nextClearBit(i)進行復制移動,最後modCount++
public void replaceAll(UnaryOperator<E> operator)根據規則替換全部符合的元素,會改變modCount
public void sort(Comparator<? super E> c)排序,會改變modCount