Java ArrayList源代码中的容量检查IF条件有什么用途
以下是Java ArrayList源代码中的容量检查IF条件有什么用途,java,arraylist,Java,Arraylist,以下是ArrayList的ensureCapacity和add方法的源代码: public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity
ArrayList
的ensureCapacity
和add
方法的源代码:
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);
}
}
public boolean add(E){
ensureCapacity(大小+1);//递增modCount!!
elementData[size++]=e;
返回true;
}
公共空间容量(国际最小容量){
modCount++;
int oldCapacity=elementData.length;
如果(最小容量>旧容量){
对象oldData[]=elementData;
int newCapacity=(旧容量*3)/2+1;
if(新容量<最小容量)
新容量=最小容量;
//minCapacity通常接近大小,因此这是一个胜利:
elementData=Arrays.copyOf(elementData,newCapacity);
}
}
现在,有了这个代码,我们的容量几乎翻了一番,当我们调用这个ensureCapacity
方法时,它被称为ensureCapacity(size+1)代码>
因此,考虑到AL的总容量为10,且给定的迭代当前大小为10,因此确保容量将被称为ensureCapacity(11)
,当执行此方法时,newCapacity
将变为16,minCapacity
将变为11,因此if(newCapacity
将返回FALSE,每当铝的容量增加时,情况总是如此
现在,如果if(newCapacity
总是返回FALSE,那么这个if条件有什么用呢。我知道JDK源代码经过了大量的同行评审,因此我很可能遗漏了一些内容,请帮助我确定此IF条件的目的。您错过了将从addAll的addAll
方法调用ArrayList
类似public boolean addAll的方法时的场景(收集您错过了将从addAll
method的ArrayList
调用ensureCapacity
方法的场景,如public boolean addAll(CollectionI还猜测,当项目被删除时,ArrayList不会收缩removed@LanceTothArrayList不会收缩,当项目从数组列表中移除时,特定索引将开始指向NULL
。当然,所有后续项目都将被移动以修复此问题,但“内存分配”除外不会更改?我不确定您所说的“内存分配不会更改”是什么意思。当动态调整数组列表的大小时,将使用Arrays.copyOf(elementData,newCapacity)为数组列表分配更多内存
我还想,当项目被删除时,ArrayList不会收缩removed@LanceTothArrayList不会收缩,当项目从数组列表中移除时,特定索引将开始指向NULL
。当然,所有后续项目都将被移动以修复此问题,但“内存分配”除外不会更改?我不确定您所说的“内存分配不会更改”是什么意思。当动态调整数组列表的大小时,将使用数组为数组列表分配更多内存。copyOf(elementData,newCapacity);