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;
}
本文详细解析了ArrayList的内部实现原理,重点介绍了其在添加元素时的动态扩容机制及删除元素的具体过程。扩容通过计算老容量的1.5倍来确定新容量,并将老数组中的元素复制到新数组中;删除操作则涉及移动后续元素并释放被删除元素的空间。

9万+

被折叠的 条评论
为什么被折叠?



