1.ArrayList的add(index,element)方法
ArrayList<Object> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add(1,"zhaoliu");
2.在add方法中,先判断下标是否合法,合法不做处理,不合法抛出异常
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
3.调用ensureCapacityInternal方法,size此时大小为3,所以ensureCapacityInternal参数值为4,elementData已经赋过值,且值为10,所以不进if判断,直接调用ensureExplicitCapacity方法且minCapacity=4
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
4.在ensureExplicitCapacity方法中,判断是否需要扩容,此时minCapacity=4,elementData.length=10,if判断不成立,所以不进判断。
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
5.接下来进行数组的复制,参数的意思是elementData 原数组,index 原数组的起始位置,elementData 目标数组,index+1目标数组的起始位置,复制的长度。elementData={'张三','李四','王五'},index=1,index+1=2,size-index=2;
那么意思就是:从原数组下标为1开始复制两个也就是{'李四','王五'}到目标数组2的位置开始放置元素,
最后得出新的数组为{'张三','','李四','王五'}这个数组
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
6.最后在空出来的位置上放置新添加的元素。
elementData[index] = element;