ArrayList的原始碼分析(二)
阿新 • • 發佈:2018-12-13
上篇文章給大家介紹了arraylist集合原始碼的一些屬性和擴容方式add方法,接下來再和大家來聊聊這個集合的一些原始碼
首先看看remove的方法,這個方法有兩個,一個是根據下標刪除物件,一個是根據物件刪除
rangeCheck(index);是一個判斷index引數的規範的,如果太長或者為負數則出現異常,
modCount這個屬性則是集合被修改的次數, 一個該集合的泛型變數接收到當前引數位置的物件,將當前集合長度減去方法的引數再減一, 這就是判斷當前這個引數所代表的這個物件是否在當前集合中,判斷如果在的話也就是 數字大於0, copy陣列,對於這個System.arraycopy的方法我解釋下:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
- 引數
src
- 源陣列。srcPos
- 源陣列中的起始位置。dest
- 目標陣列。destPos
- 目的地資料中的起始位置。length
- 要複製的陣列元素的數量。
這樣複製的陣列的銷量是最快的. 這樣copy之後就想到於噹噹原陣列的index位置的下標+1開始向前移動,index下標位置被後面的代替,而陣列的最後的兩位將變得一致,不懂的可以自己測試一下這個方法,而 後面那個[--size]=null就是將最後面一位設定為null,這樣就完成了按照下標刪除的操作
接下來是按照集合中的物件去刪除
這個東西就很好理解了,引數如果等於null的話就去整個數組裡面找為null的然後刪除,else中是通過equals方法去整個陣列中去查詢該物件,然後刪除,這裡用到了 fastRemove這個方法,我們來看看
是不是感覺這個方法很 眼熟,這不就是根據下標刪除嗎?沒錯,當它拿到你需要刪除的物件的下標之後依然根據這個下標刪除就行了
ArrayList的get方法就沒什麼好講的了,因為當你知道了它的底層是陣列的時候get下標拿到物件那不是很簡單就能實現的嗎