Java进阶 - [1-5] 集合容器

 

 

ArrayList

 

add

1、先确认是否需要扩容,如果需要,则进行扩容操作ensureExplicitCapacity

2、进行赋值 elementData[size++] = e;

 

扩容

1、如果所需的最小容量大于elementData数组的容量,则进行扩容操作。

private void ensureExplicitCapacity(int minCapacity){
    /* 变化次数加1 */
    modCount++;
    /* 如果所需的【最小容量】大于elementData数组的容量,则进行扩容操作 */
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

2、第一次扩容,扩容原有容量的一半(比如原有为10,扩容后容量为15)。

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // 第一次扩容,扩容原有容量的一半(比如原有为10,扩容后容量为15)。
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 新的长度newCapacity依然无法满足需要的最小扩容量minCapacity,则新的扩容长度为minCapacity
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    // 新的长度newCapacity超出了最大的数组长度MAX_ARRAY_SIZE,则申请更大的容量hugeCapacity()
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);

    // 扩展数组长度为newCapacity,并且将旧数组中的元素赋值到新的数组中
    elementData = Arrays.copyOf(elementData, newCapacity);
}

3、如果新扩容长度无法满足所需空间,则申请更大的容量

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

 

 

LinkedList

 

HashMap

 

 

 

 

 

 

 

— 要养成终生学习的习惯 —

posted @ 2024-03-20 19:33  HOUHUILIN  阅读(3)  评论(0编辑  收藏  举报