LinkedList真的是查找慢增刪快?

本文基於https://juejin.im/post/5c00987de51d451aa843b67b 這個文章又本身測了一下,看了這個文章之前個人認知一直是linkedList增刪快,查詢慢,arrayList查詢快增刪慢,雖然這個文章對於插入的位置比較極端,可是也算是顛覆認知了,文章中對於開頭和結尾插入快慢的緣由已經經過源碼分析的很透徹了,對於中間插入的測試可能不太好經過數據結構來講明,因而乎我本身寫了個測試方法測試了一波,代碼和結果以下,若是不對歡迎指正,輕噴,別罵全家 代碼數組

/**
     *
     * @param count 數組長度
     * @param index 插入位置比例
     */
    public static void testInsert(int count, double index) {
        LinkedList testLinkedList = new LinkedList();
        ArrayList testArrayList = new ArrayList();
        for (int i = 0; i < count; i++) {
            testLinkedList.add(7);
            testArrayList.add(7);
        }
        System.out.println("開始插入,LinkedList長度爲:" + testLinkedList.size());
        System.out.println("開始插入,ArrayList長度爲:" + testArrayList.size());
        long linkedMidBegin = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            int coefficientIndex = (int)(testLinkedList.size() * index);
            testLinkedList.add(coefficientIndex, 7);
        }
        long linkedMidEnd = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            int coefficientIndex = (int)(testArrayList.size() * index);
            testArrayList.add(coefficientIndex, 7);
        }
        long arrayMidEnd = System.currentTimeMillis();
        System.out.println("長度比例:" + index + "插入完成,LinkedList長度爲:" + testLinkedList.size() + " 耗時:" + (linkedMidEnd - linkedMidBegin) + "ms");
        System.out.println("長度比例:" + index + "插入完成,ArrayList長度爲:" + testArrayList.size() + " 耗時:" + (arrayMidEnd - linkedMidEnd) + "ms");
    }
複製代碼

結果bash

開始插入,LinkedList長度爲:100000
開始插入,ArrayList長度爲:100000
長度比例:0.025插入完成,LinkedList長度爲:200000  耗時:1721ms
長度比例:0.025插入完成,ArrayList長度爲:200000  耗時:1834ms
複製代碼

通過多測修改係數測試,也就是說只有在插入的位置是總長度的1/40左右的時候linkedList和arrayList的速度是差很少,以後arrayList的速度都比linkedList快,若是arrayList設置合適的初始長度,避免擴容,速度會更快。數據結構

總結 若是沒有特殊需求,儘可能用arrayList,畢竟查詢很快,插入速度在多數狀況下不慢,畢竟通常需求插入的位置基原本說是平均分配的。源碼分析

人懶不喜排版,隨便看看吧。post

相關文章
相關標籤/搜索