Java ArrayList 與 LinkedList性能對(duì)比

ArrayList是如何插入、刪除數(shù)據(jù)的?

image.png

1.當(dāng)插入一個(gè)data的時(shí)候會(huì)先檢查數(shù)組是否需要擴(kuò)容。

擴(kuò)容的機(jī)制并不是說我需要添加N個(gè)數(shù)據(jù) 我就擴(kuò)N個(gè)位置,而是有默認(rèn)大小10個(gè)長(zhǎng)度,當(dāng)位置不夠時(shí)通過位運(yùn)算擴(kuò)大1.5倍。因此當(dāng)存放大量數(shù)據(jù)時(shí),每次擴(kuò)容都會(huì)消耗很多資源。
具體請(qǐng)參考(https://www.cnblogs.com/baichunyu/p/12965241.html

擴(kuò)容代碼.png

2.數(shù)據(jù)復(fù)制與賦值

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

將data后面的數(shù)據(jù)G、H、I進(jìn)行復(fù)制并賦值到后面一位并將data賦值到指定位置


image.png

這樣就完成了一次add,當(dāng)我們插入的數(shù)據(jù)后面數(shù)據(jù)越多就會(huì)越消耗性能,越慢。刪除也是同理。

LinkedList是如何插入、刪除數(shù)據(jù)的?

LinkedList是典型的鏈表設(shè)計(jì)(雙向鏈表)


鏈表設(shè)計(jì)圖.png

每個(gè)數(shù)據(jù)都包含了本數(shù)據(jù)和上一個(gè)數(shù)據(jù)的指針與下一個(gè)數(shù)據(jù)的指針。

  • LinkedList.Node.class
    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

當(dāng)你需要添加數(shù)據(jù)時(shí),只需要將數(shù)據(jù)填入鏈表,并修改對(duì)應(yīng)數(shù)據(jù)的指針既可以實(shí)現(xiàn)。

總結(jié)

由此可見,當(dāng)需要插入數(shù)據(jù)時(shí),LinkedList的性能是優(yōu)于ArrayList的。
相反,當(dāng)你需要查詢數(shù)據(jù)的時(shí)候,ArrayList是更快的,因?yàn)锳rrayList是數(shù)組,直接通過下標(biāo)就可以訪問到,而鏈表需要你循環(huán)找到位置。

最后編輯于
?著作權(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)容