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
— 要养成终生学习的习惯 —

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号