ArrayList的添加和删除操作实现原理图解

上一篇 << 下一篇 >>>ArrayList的动态扩容、ModCount及fail-fast原理


Arraylist数据结构:集合底层使用动态数组实现,随机查询效率非常快,插入和删除需要移动整个数组、效率低。

ArrayList添加操作交互图

ArrayList的添加和删除操作实现原理图解_第1张图片

ArrayList删除操作

实现原理: 数组移动,末位置为null

//下标范围检测,看是否数组越界
if (index >= size) {
    throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
//启动线程安全问题
modCount++;
//获得要删除的数据
E oldValue = (E) elementData[index];
/**
 * 判断需要移动的数据
 * a、假设现有数据[1,2,3,4,5],现在需要把3数据移除,传入的index为2
 * b、则需要移动的位数:总位数5-传入的2-1=2
 * c、也就是3删除后,4和5两个数左移,numMoved=2
 *
 */
int numMoved = size - index - 1;

if (numMoved > 0) {
    /**
     * 数据移动参数:
     * ---源----
     * elementData:现有数据
     * index + 1:从哪个下标开始往前移
     * ---目标----
     * elementData:移动到的目标数组是什么
     * index:需要往前移到哪个下标开始
     * ---移动的个数----
     * numMoved:需要移动多少个
     */
    System.arraycopy(elementData, index + 1, elementData, index,
            numMoved);
}
//末位置为null,数组长度不变
elementData[--size] = null;
return oldValue;

相关文章链接:
<< << << <<<数组拷贝的几种方式及和链表结构的对比
<< << << << << <<<基于LinkedHashMap手写LRU淘汰策略
<< << <<

你可能感兴趣的:(ArrayList的添加和删除操作实现原理图解)