JDK之ArrayList原始碼解讀 二

2021-09-07 13:05:14 字數 1908 閱讀 2185

目錄

remove(int index)

remove(object o)

clear()

addall(collection c)

addall(int index, collection c)

removerange(int fromindex, int toindex)

public e remove(int index)
作用:刪除索引位置處的元素。

先檢查索引是否合法,然後modcount加1。然後獲取index位置上原有的元素的值,最後返回該值。

通過system.arraycopy方法,將arraylist的陣列中index位置的後一位到陣列結束的所有元素都向左移動一位,同時將陣列的最後乙個位置設定為null,方便gc進行**。

public boolean remove(object o) 

} else

}return false;

}

作用:刪除arraylist中值等於object o的第一元素。

當object o為null時,遍歷陣列,當遇到第乙個值為null的時候,呼叫fastremove刪除該值,並將所有後面的元素往前移動一位。

private void fastremove(int index)
fastremove的作用於前面的remove(int index)方法作用類似,只是少了引數的校驗和返回值。

當object o不為null時,遍歷陣列,當遇到第乙個值等於object o的時候,呼叫fastremove刪除該值,並將所有後面的元素往前移動一位。

public void clear()
作用:清空arraylist中的所有元素。

遍歷陣列,將所有位置的值都設定成null,便於gc,同時將arraylist元素個數歸0。

public boolean addall(collection<? extends e> c)
作用:將collection c中的元素加入arraylist的末尾。

先將collection c轉換成陣列,再將collection c中所有元素個數加上arraylist元素的個數,與陣列的容量對比,根據結果來判斷陣列是否需要擴容。然後利用native方法system.arraycopy(),將collection c的元素複製到arraylist的尾部,arraylist元素的個數size要加上collection c的元素個數。

public boolean addall(int index, collection<? extends e> c)
作用:將collection c中的元素加入arraylist中指定的位置上。

先使用rangecheckforadd()校驗索引的合法性。再將collection c轉換成陣列,再將collection c中所有元素個數加上arraylist元素的個數,與陣列的容量對比,根據結果來判斷陣列是否需要擴容。然後利用native方法system.arraycopy(),將陣列中index索引處往後數c.length個元素,往後移動。然後將collection c的元素放入陣列中空出來的那些位置上。

protected void removerange(int fromindex, int toindex) 

size = newsize;

}

作用:刪除arraylist中兩個位置中間的所有元素。

將陣列中從toindex位置到結尾處的所有元素,移動到fromindex位置處。然後將陣列中從末尾往前數,數出(toindex-fromindex)個位置,將他們設定成null,便於gc。新arraylist的元素個數重新賦值。

JDK1 8 ArrayList擴容機制原始碼分析

屬性 預設長度 private static final int default capacity 10 空陣列 有參構造器 private static final object empty elementdata 空陣列 無參構造器 private static final object def...

ArrayList的remove 方法原始碼解讀

remove index public boolean remove object obj else return false arraylist的remove object obj 方法判斷是否為同乙個物件的時候用的是equals方法,如果我們要移除list中的自定義類的時候需要重寫equals方...

JDK13 HashMap resize原始碼解析

resize是重新雜湊,所以要在現在容量和閾值的基礎上獲取新的容量和閾值,函式首先進行了變數定義 final hashmap.node resize else if newcap oldcap 1 maximum capacity oldcap default initial capacity de...