通過分析原始碼,你會發現,一些你在工作中無法體會到的一些現象,通過原始碼的了解,會擴散你的思維.這一次是講解下arraylist的刪除以及通過角標來新增元素。在檢視刪除方法的時候,remove方法存在兩個過載的方法,乙個是index乙個通過值的形式,進行刪除,
public e remove(int index)
public boolean remove(object o)
} else
}return false;
}
誰的效能強弱,一眼就知道.那麼我們來看下他們是怎樣的乙個刪除元素的呢.
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
通過這段**進行刪除的,現在我們來剖析下這段**的含義.int nummoved = size - index - 1;首先這段**,是計算當前角標下後面所有的元素的大小,size當前元素實際大小,index 當前的角標 減去1就是除去自身,且計算的後面數值個數大於0這個主要是解決效能問題.(都等於0了,就沒有必要再去記憶體中進行拷貝一遍了) 現在重點就是system.arraycopy 是乙個怎樣的工作流程.我們通過一些案例和畫圖來對其進行描述下.先描述下system.arraycopy(elementdata, index+1, elementdata, index, nummoved);這個方法引數,第乙個是原始資料集,第二個是從哪個地方開始進行讀取,在原始資料集中,第三個是拷貝到**的資料集new資料集,第四個是新的資料集中將原始資料集讀取到的資料放到哪個位置中,第五個,拷貝幾個.
下面在通過demo來演示一波
objectobj=;
int index=1;//要刪除的角標
int siez=3;//當前真實大小
system.out.println("處理前的資料集:"+arrays.tostring(obj));
system.arraycopy(obj,index+1,obj,index,siez-index-1);
//進行拷貝後的資料
system.out.println("拷貝後的資料集:"+arrays.tostring(obj));
//開始進行移除操作
obj[--siez]=null;
system.out.println("刪除後的資料集"+arrays.tostring(obj));
執行的結果:
處理前的資料集:[1, 2, 3, null, null, null, null, null, null, null]
拷貝後的資料集:[1, 3, 3, null, null, null, null, null, null, null]
刪除後的資料集[1, 3, null, null, null, null, null, null, null, null]
可以看到,跟我們在流程圖中畫的一樣的乙個情況,通過分析後,我們可以了解到,這樣的拷貝元素的資料是最快捷,效率是最有效的. ArrayList原始碼分析 JDK1 8
借助工具類arrays,實現陣列複製 elementdata arrays.copyof elementdata,newcapacity 底層呼叫system.arraycopy system.arraycopy original,0,copy,0,math.min original.length,...
jdk1 8原始碼解析 ArrayList
arraylist是乙個長度可調節的陣列,使用者只需向其中新增,刪除,獲取元素,可以向其中新增任何物件 包括null值 無需關係它的擴容,縮減問題。它實現了list介面所有方法,它基本等價於vector,唯一不同的是它沒有任何同步手段,多執行緒環境須慎重考慮。這裡唯一需要注意的是,它實現了乙個ran...
JDK1 8原始碼閱讀(五) ArrayList
顧名思義,arraylist的結構實際就是乙個陣列。所以它的特性很明顯,插入乙個元素的時候,是耗時是乙個常量時間o 1 在插入n個元素的時候,需要的時間就是o n arraylist類圖設計 初始化預設容量 private static final int default capacity 10 空...