聊以慰藉 · 程式 ·

JDK中ArrayList的remove函數原理解讀

ArrayList刪除數據元素有兩種方式:remove(int index)和remove(Object o),按照數組下標進行刪除和按照數組元素值進行刪除,ArrayList數據按照下標index進行刪除,首先檢查需要刪除的下標在數組中是否越界,如果越界則拋出異常,否則進行數據的刪除操作,刪除的方式是通過System.arraycopy(arg1,arg2,arg3,arg4,arg5)函數進行數組元素的拷貝,拷貝結束後數組的最後一位置空即長度減一,這樣刪除結束,按照下標刪除數據最後返回值就是被刪除的元素。


1、下標刪除

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);

elementData[--size] = null; // clear to let GC do its work

return oldValue;

}

2、元素對象刪除

按照數組中存的元素值進行刪除,首先判斷元素是否為null,若為null則進入null元素刪除分支,循環數組中每一個元素進行判斷,對象是null的調用fastRemove(index)進行刪除;若不為null則進入另一個刪除分支,判斷元素所在的位置index,找到坐標後,調用fastRemove(index)進行刪除。

public boolean remove(Object o) {

if (o == null) {

for (int index = 0; index < size; index++)

if (elementData[index] == null) {

fastRemove(index);

return true;

}

} else {

for (int index = 0; index < size; index++)

if (o.equals(elementData[index])) {

fastRemove(index);

return true;

}

}

return false;

}

數組元素刪除的關鍵操作,需要刪除的元素所在的位置通過拷貝的形式把數組後面的元素整體前移占據該元素的位置,通過System.arraycopy(arg1,arg2,arg3,arg4,arg5)函數進行數組元素的拷貝,該函數可以進行自拷貝,arg1原數組,arg2要刪除元素的位置的後一位,arg3目標數組,arg4元素要放入目標數組中的位置,arg5原數組中要拷貝的元素個數即從arg2開始往後多少個元素。拷貝結束後數組的最後一位置空即長度減一,這樣刪除結束。

private void fastRemove(int index) {

modCount++;

int numMoved = size - index - 1;

if (numMoved > 0)

System.arraycopy(elementData, index+1, elementData, index,numMoved);

elementData[--size] = null; // clear to let GC do its work

}

數組越界檢查

private void rangeCheck(int index) {

if (index >= size)

throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

}

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯