ArrayList 的扩容机制

01 Apr 2020

ArrayList 是怎么扩容的,以下是 jdk 11 的部分源码

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
}

扩容大小主要是这一行

int newCapacity = oldCapacity + (oldCapacity >> 1);

新的容量是旧容量 + 旧容量值右移一位 得到的

右移一位相当于除以2,假如老容量是15,扩容后是 15+(15/2) = 22