源代码实现
public E remove(int index) { rangeCheck(index);//先判断数组是否越界 modCount++; E oldValue = elementData(index); //处理数据 int numMoved = size - index - 1;
//remove方法是将原数组的指定下标位置后面的值复制好然后再覆盖原有的指定下标位置,再将最后的一个置为空方便gc
调用的system.arraytcopy
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代码解释:
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度 如果一个arraylist集合有0,1,2,3,4,5的数据
然后 remove(3)从原数组的下标为4就是4开始,复制两个长度也就是4和5复制这两个,
接着 从目标数组开始(这里也是当前数组)的下标为3这里将其覆盖也就是变成0,1,2,4,5,5,
最后将最后一位置为null就变成0,1,2,4,5,null
if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
//源代码
public void add(int index, E element) { rangeCheckForAdd(index);//判断数组是否越界 ensureCapacityInternal(size + 1); // Increments modCount!!给数组扩容
同理
0,1,2,3,4,5
list.add(3,element)
从下标为3的数据开始往后面复制3个数即3,4,5
覆盖到目标数组下标为4的位置,变成了0,1,2,3,3,4,5
最后将下标为3的值设置为添加的数据
System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }