ArrayList源代码中容量检查IF条件的用途是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList源代码中容量检查IF条件的用途是什么相关的知识,希望对你有一定的参考价值。

以下是ArrayListensureCapacityadd方法的源代码:

public boolean add(E e) {
    ensureCapacity(size + 1); // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3) / 2 + 1;
        if (newCapacity < minCapacity)
            newCapacity = minCapacity;
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

现在,使用这段代码,我们几乎将容量加倍,当我们调用这个ensureCapacity方法时,它被称为ensureCapacity(size + 1);

因此,考虑到AL的总容量为10,并且给定的迭代当前大小为10,因此确保容量将被称为ensureCapacity(11),当此方法将被执行时,newCapacity将变为16并且minCapacity将为11,因此if (newCapacity < minCapacity)将返回FALSE ,每当AL的容量增加时,情况总是如此。

现在,如果if (newCapacity < minCapacity)总是返回FALSE那么这个IF条件的用途是什么。我知道JDK源代码经过了大量的同行评审,所以很有可能我错过了一些东西,请帮我确定这个IF条件的目的。

答案

你错过了ensureCapacity方法将从addAll ArrayListpublic boolean addAll(Collection<? extends E> c) {方法调用ensureCapacity(size + numNew);,并且像numNew一样被调用的场景,这里if (newCapacity < minCapacity)可能是非常高的数量,这使得qazxswpoi可能会返回TRUE。

以上是关于ArrayList源代码中容量检查IF条件的用途是什么的主要内容,如果未能解决你的问题,请参考以下文章

Java8 ArrayList源码分析

ArrayList的容量与长度

list遍历陷阱分析原理

ArrayList底层原理

使用反射机制,获取 ArrayList 的容量大小

从源代码来理解ArrayList和LinkedList差别