ArrayList的扩容机制
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
//某种操作后 容器容量大小大于阈值 扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
//获取当前元素大小
int oldCapacity = elementData.length;
//获取oldCapacity*1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//经过最大值最小值临界判断
elementData = Arrays.copyOf(elementData, newCapacity);
}
删除方法:
public boolean remove(Object o) {
if (o == null) {
//遍历找出下标 调用fastRemove(int index)
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
//调用System.arraycopy方法复制,arrayList支持
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//gc释放
elementData[--size] = null;
}
arrayList下标查询最快,不用寻址 删除涉及切割数组 较慢