Awesome-Android-Interview icon indicating copy to clipboard operation
Awesome-Android-Interview copied to clipboard

关于 Java 基础面试题里 ArrayList 扩容的勘误

Open DysaniazzZ opened this issue 2 years ago • 0 comments

ArrayList和LinkedList怎么动态扩容的吗? ArrayList 初始化大小是 10 (如果你知道你的arrayList 会达到多少容量,可以在初始化的时候就指定,能节省扩容的性能开支) 扩容点规则是,新增的时候发现容量不够用了,就去扩容 扩容大小规则是,扩容后的大小= 原始大小+原始大小/2 + 1。(例如:原始大小是 10 ,扩容后的大小就是 10 + 5+1 = 16)

这里的表述是错误的,源码扩容的关键方法如下:

/**
 * Increases the capacity to ensure that it can hold at least the
 * number of elements specified by the minimum capacity argument.
 *
 * @param minCapacity the desired minimum capacity
 */
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity);
}

从源码可以看出 int newCapacity = oldCapacity + (oldCapacity >> 1); 扩容后新数组的容量会增加为原来的1.5倍,而不是 1.5倍+1。

DysaniazzZ avatar Oct 14 '23 07:10 DysaniazzZ