List容量及擴(kuò)容

JDK1.7

數(shù)據(jù)結(jié)構(gòu) 默認(rèn)容量 擴(kuò)容
ArrayList 數(shù)組 10 1.5倍或增加數(shù)據(jù)后的長度 (取最大值)
Vector 數(shù)組 10 指定擴(kuò)容增量或2倍(取最大值)
LinkedList 雙向鏈表 無默認(rèn)容量 不需要擴(kuò)容

JDK1.8

數(shù)據(jù)結(jié)構(gòu) 默認(rèn)容量 擴(kuò)容
ArrayList 數(shù)組 10 第一次最小為10、以后為1.5倍或增加數(shù)據(jù)后的長度(取最大值)
Vector 數(shù)組 10 指定擴(kuò)容增量或2倍(取最大值)
LinkedList 雙向鏈表 無默認(rèn)容量 不需要擴(kuò)容

ArrayList (jdk1.7、jdk1.8)

數(shù)據(jù)結(jié)構(gòu)
jdk1.7
//數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
private transient Object[] elementData;
jdk1.8
//數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
transient Object[] elementData;
默認(rèn)容量
jdk1.7
public ArrayList() {
    this(10);
}
public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

jdk1.8
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// size默認(rèn)為0
private int size;
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
擴(kuò)容
jdk1.7
public boolean add(E e) {
    // 擴(kuò)容方法
    ensureCapacityInternal(size + 1);  
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    modCount++;
    // 大于當(dāng)前數(shù)組長度才進(jìn)行擴(kuò)容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
// 擴(kuò)容正常最大值(-8因?yàn)閖ava有保留)
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
// minCapacity-->add、addAll 方法計(jì)算需要最小容量
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    // 新數(shù)組大小為原有數(shù)組1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 默認(rèn)擴(kuò)容大小、數(shù)組需要容量最小值 判斷取最大值
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // System.arraycopy native方法
    elementData = Arrays.copyOf(elementData, newCapacity);
}
// 獲取數(shù)組長度最最最大值
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0)
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}


jdk1.8
// 默認(rèn)擴(kuò)容大小
private static final int DEFAULT_CAPACITY = 10;
public boolean add(E e) {
    // 擴(kuò)容方法
    ensureCapacityInternal(size + 1);  
    elementData[size++] = e;
    return true;
}
//擴(kuò)容內(nèi)部方法
private void ensureCapacityInternal(int minCapacity) {
    // 對(duì)象為空{(diào)},本方法為第一次調(diào)用。比較默認(rèn)容量和參數(shù)指定容量,取最大值
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        // 最小長度為默認(rèn)的10
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}
// 擴(kuò)容判斷方法
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // 大于數(shù)組長度才進(jìn)行擴(kuò)容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
// 擴(kuò)容正常最大值(-8因?yàn)閖ava有保留)
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//minCapacity-->add、addAll 方法計(jì)算需要最小容量
private void grow(int minCapacity) {
     int oldCapacity = elementData.length;
    // 新數(shù)組大小為原有數(shù)組1.5倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);
     // 默認(rèn)擴(kuò)容大小、數(shù)組需要容量最小值 判斷取最大值
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
     // System.arraycopy native方法
    elementData = Arrays.copyOf(elementData, newCapacity);
}
// 獲取數(shù)組長度最最最大值
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0)
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

Vector (jdk1.7、jdk1.8)

數(shù)據(jù)結(jié)構(gòu)
jdk1.7
  //數(shù)據(jù)結(jié)構(gòu)
  protected Object[] elementData;
  // 容量增量
  protected int capacityIncrement;

jdk1.8
 // 數(shù)據(jù)結(jié)構(gòu)
 protected Object[] elementData
  //容量增量
 protected int capacityIncrement;
默認(rèn)容量
jdk1.7
// 默認(rèn)10
public Vector() {
    this(10);
}
// 容量增量為0
public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
}

jdk1.8
// 同jdk1.7
擴(kuò)容
jdk1.7
// 同步add方法
public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}
// 擴(kuò)容判斷方法
private void ensureCapacityHelper(int minCapacity) {
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
// 擴(kuò)容方法
private void grow(int minCapacity) { 
    int oldCapacity = elementData.length;
    // 擴(kuò)容增量大于0,按照指定的擴(kuò)容增量增加,反之在原有長度上增加1倍
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
    // 以下同ArrayList
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

jdk1.8
// 同jdk1.7

LinkedList (jdk1.7、jdk1.8)

數(shù)據(jù)結(jié)構(gòu)
jdk1.7

transient int size = 0;
transient Node<E> first;// 第一個(gè)元素
transient Node<E> last;// 最后一個(gè)元素
private static class Node<E> {
    E item;//本身元素
    Node<E> next;// 下一個(gè)元素對(duì)象引用
    Node<E> prev;//上一個(gè)元素對(duì)象引用

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
 }

 jdk1.8
 //同jdk1.7
默認(rèn)容量
無默認(rèn)容量(鏈表結(jié)構(gòu))
擴(kuò)容
無需擴(kuò)容,只要內(nèi)存夠大, 就可以無限制,前提是不考慮效率問題
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容