ArrayList解析

基于JDK1.8
只列出關(guān)鍵方法,主要關(guān)注默認情況、初始化、擴容、add、remove。

private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() { //默認是個空數(shù)組,也有重載方法可以設置初始數(shù)組大小
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public boolean add(E e) {
    ensureCapacityInternal(size + 1); //關(guān)注這個方法
    elementData[size++] = e;
    return true;
}
private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默認就是10
    }
    ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    if (minCapacity - elementData.length > 0) //超過數(shù)據(jù)長度
        grow(minCapacity);
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); //按1.5倍擴容
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

get(int index)比較簡單,直接返回elementData[index]。
ArrayList比較簡單,默認情況下是空數(shù)據(jù),第一次add默認初始化長度10,每次按1.5倍擴容。再看下remove

public E remove(int index) {
    rangeCheck(index);
    modCount++;
    E oldValue = elementData(index);
    int numMoved = size - index - 1; //判斷是不是最后一項,如果不是最后一項,就把該index后面的數(shù)據(jù)項都賦值給前一位,然后再把最后一項設為null
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; //這行代碼值得很多人學習,數(shù)組集合里沒用的項要及時釋放
    return oldValue;
}

附圖


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • List是Java中非常常用的數(shù)據(jù)結(jié)構(gòu),而ArrayList是其中最常用的實現(xiàn),ArrayList正如它的名稱一樣...
    whthomas閱讀 450評論 1 6
  • 一、概要 ArrayList是一個 動態(tài)數(shù)組,線程不安全的,允許值為null 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,采用默認構(gòu)造方法...
    史云龍閱讀 556評論 0 0
  • 文章有點長,比較啰嗦,請耐心看完?。ɑ贏ndroid API 25) 一、概述 首先得明白ArrayList在數(shù)...
    JerryloveEmily閱讀 3,235評論 2 15
  • 一、對于ArrayList需要掌握的七點內(nèi)容 ArrayList的創(chuàng)建:即構(gòu)造器 往ArrayList中添加對象:...
    rochuan閱讀 896評論 0 0
  • [TOC] algorithm 4th筆記(1.1) 二分查找 前提:數(shù)組有序BinarySearch.java ...
    百煉閱讀 482評論 0 2