上一篇 <<<Java集合類圖總覽
下一篇 >>>ArrayList的動(dòng)態(tài)擴(kuò)容、ModCount及fail-fast原理
Arraylist數(shù)據(jù)結(jié)構(gòu):集合底層使用動(dòng)態(tài)數(shù)組實(shí)現(xiàn),隨機(jī)查詢效率非???,插入和刪除需要移動(dòng)整個(gè)數(shù)組、效率低。
ArrayList添加操作交互圖

ArrayList刪除操作
實(shí)現(xiàn)原理: 數(shù)組移動(dòng),末位置為null
//下標(biāo)范圍檢測(cè),看是否數(shù)組越界
if (index >= size) {
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
//啟動(dòng)線程安全問(wèn)題
modCount++;
//獲得要?jiǎng)h除的數(shù)據(jù)
E oldValue = (E) elementData[index];
/**
* 判斷需要移動(dòng)的數(shù)據(jù)
* a、假設(shè)現(xiàn)有數(shù)據(jù)[1,2,3,4,5],現(xiàn)在需要把3數(shù)據(jù)移除,傳入的index為2
* b、則需要移動(dòng)的位數(shù):總位數(shù)5-傳入的2-1=2
* c、也就是3刪除后,4和5兩個(gè)數(shù)左移,numMoved=2
*
*/
int numMoved = size - index - 1;
if (numMoved > 0) {
/**
* 數(shù)據(jù)移動(dòng)參數(shù):
* ---源----
* elementData:現(xiàn)有數(shù)據(jù)
* index + 1:從哪個(gè)下標(biāo)開始往前移
* ---目標(biāo)----
* elementData:移動(dòng)到的目標(biāo)數(shù)組是什么
* index:需要往前移到哪個(gè)下標(biāo)開始
* ---移動(dòng)的個(gè)數(shù)----
* numMoved:需要移動(dòng)多少個(gè)
*/
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
}
//末位置為null,數(shù)組長(zhǎng)度不變
elementData[--size] = null;
return oldValue;
相關(guān)文章鏈接:
<<<Java集合類圖總覽
<<<ArrayList的動(dòng)態(tài)擴(kuò)容、ModCount及fail-fast原理
<<<LinkedList增刪改查操作底層實(shí)現(xiàn)原理
<<<數(shù)組拷貝的幾種方式及和鏈表結(jié)構(gòu)的對(duì)比
<<<Jdk1.7HashMap源碼分析
<<<Jdk1.7HashMap如何擴(kuò)容及解決死循環(huán)問(wèn)題
<<<JDK1.8HashMap源碼分析
<<<ConcurrentHashMap在JDK1.8版本比1.7改進(jìn)了什么
<<<JDK8的HashMap中紅黑樹左旋右旋原理圖解
<<<基于LinkedHashMap手寫LRU淘汰策略
<<<HashSet集合底層實(shí)現(xiàn)原理
<<<HashTable底層實(shí)現(xiàn)原理及和ConcurrentHashMap區(qū)別
<<<java集合常見面試題