[英]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 次分配和復制(取決於列表的初始大小)。
要添加到鏈表,每次添加都需要您:
ArrayList
和LinkedList
的所有額外工作都是在幕后通過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.