ArrayList#remove学习记录

    技术2022-08-01  83

    直接上ArrayList#remove源码。

    /** * 移除此列表中指定位置的元素。 * 将后面的元素向左移动(在它们的后面减去一个指数) * * @param 索引要删除的元素的索引 * @return 从列表中删除的元素 * @throws IndexOutOfBoundsException {@inheritDoc} */ 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); // 将源数组从index+1下标出拷贝添加到目标数组index处 elementData[--size] = null; // 清除,让GC完成它的工作 return oldValue; }

    源码解析:

    rangeCheck()判定传入的元素下表是否超出集合范围,超出抛出IndexOutOfBoundsException异常。System.arraycopy(elementData, index+1, elementData, index, numMoved);对数组进行拷贝,删除【会将需要删除的元素后面所有的元素向前移动】

     

    System.arraycopy的使用:

    public static void arraycopy(Object src,                              int srcPos,                              Object dest,                              int destPos,                              int length)

    将指定源数组中的数组从指定位置复制到目标数组的指定位置。 阵列组件的一个子序列被从通过引用的源阵列复制src被引用的目标阵列dest 。 复制的组件数量等于length参数。 源阵列中位置srcPos至srcPos+length-1的组件分别复制到目标阵列的位置destPos至destPos+length-1 。  如果src个dest参数指代相同的数组对象,则被处理是否在位置上的部件进行复印srcPos通过srcPos+length-1首先被复制到一个临时的阵列length组分,然后将临时数组的内容被复制到的位置destPos通过destPos+length-1目标数组的。 

        将B1数组的最后一个元素复制到a1数组中的最后一个元素中。 必须使用数组src和dest数组泛型都必须为同一类型注意数组长度 public static void main(String[] args) { Integer[] a1 = {1,2,3,4}; Integer[] b1 = {5,6,7,8}; int destLength = a1.length;// 目标数组长度 // a1 = Arrays.copyOf(a1, a1.length+b1.length); // length:复制的组件数量等于length参数。 System.arraycopy(b1,b1.length-1,a1,a1.length-1,1); System.out.println(Arrays.toString(a1)); }

    将b1数组合并到a1数组中。 public static void main(String[] args) { Integer[] a1 = {1,2,3,4}; Integer[] b1 = {5,6,7,8}; a1 = Arrays.copyOf(a1, a1.length+b1.length); // length:复制的组件数量等于length参数。 System.arraycopy(b1,0,a1,a1.length-b1.length,b1.length); System.out.println(Arrays.toString(a1)); }

    --------------------------------------------------------------------------------------------------------------------------

    ArrayList中的remove方法就是使用这个方法实现的。

    Processed: 0.016, SQL: 9