簡體   English   中英

Java,添加時間LinkedList vs ArrayList

[英]Java, Adding time LinkedList vs ArrayList

只是將 Integer 數字添加到 Arraylist 和 Linkedlist,到最后的 position,為什么添加 Z8DC4BB7771CF6C82F6C8 比鏈接列表更快? 我編譯了很多次,在arraylist中加入速度更快,為什么?

據我所知, ArrayList 將數組復制 2^n+1 大小。 而linkedlist只改變節點

class Test1 {

public static void main(String[] args) {
    ArrayList<Integer> arrayList = new ArrayList<>();
    LinkedList<Integer> linkedList = new LinkedList<>();

    addToList(arrayList);
    System.out.println("-----------------");
    addToList(linkedList);

}

public static void addToList(List list) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 5_000_000; i++) {
        list.add(i);
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);

}

}

當您添加到ArrayList時,您只需將 integer 存儲在后備數組中。 每隔一段時間,當后備數組填滿時,您必須分配一個新數組並將所有舊項目復制到新數組中。 給定 500 萬個整數,您將不得不進行大約 20 次分配和復制(取決於列表的初始大小)。

要添加到鏈表,每次添加都需要您:

  1. 分配 memory 並初始化一個新的鏈表節點。
  2. 將新節點鏈接到列表的末尾。

ArrayListLinkedList的所有額外工作都是在幕后通過add方法完成的。

500 萬個鏈表節點分配和鏈接的開銷高於 500 萬ArrayList插入的開銷,即使您計算ArrayList在填滿時必須執行的 20 次左右的分配和復制操作也是如此。

因此,盡管每個操作都需要恆定時間(盡管在ArrayList的情況下,它實際上是攤銷的恆定時間),但附加到鏈表的常數高於附加到ArrayList的常數。

ArrayList不會每次都復制整個數組,它會在當前數組中沒有更多空間時創建一個大小翻倍的新數組。

因此,如果您有一個具有 3 個元素的ArrayList ,則底層數組的大小可能為 4。因此,添加新元素不需要創建新數組並復制 3 個值,因此時間復雜度為 O(1)。

它們現在都是 O(1),但是ArrayList只需要將值放在 memory 中的正確位置,而LinkedList需要分配新空間(用於新節點)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM