ArrayList、LinkedList原理解析
ArrayList并非直接声明出固定大小的数组,供添加元素使用, 而是在添加元素的时候首先进行一次动态扩容;
1、ArrayList新增方法:
源码实现如下:
private void ensureCapacityInternal(int minCapacity) {
//如果初始数组, 获取容量的最大值
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//扩容
ensureExplicitCapacity(minCapacity);
}
//扩容底层实现
private void grow(int minCapacity) {
//获取扩容前的元素个数
int oldCapacity = elementData.length;
//老容量的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);
}
2、ArrayList删除方法:
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
//数组中的元素进行拷贝
System.arraycopy(elementData, index+1, elementData, index, numMoved);
//删除引用, 便于GC回收
elementData[--size] = null;
return oldValue;
}