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;