ArrayList的添加和刪除操作實(shí)現(xiàn)原理圖解

上一篇 <<<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集合常見面試題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容