簡體   English   中英

添加元素時java鏈表比arraylist慢?

[英]java linkedlist slower than arraylist when adding elements?

我認為鏈接列表在添加元素時應該比arraylist更快? 我剛剛測試了添加,排序和搜索元素所需的時間(arraylist vs linkedlist vs hashset)。 我只是使用java.util類進行arraylist和linkedlist ...使用每個類可用的add(object)方法。

arraylist out在填寫列表時執行鏈表...並在列表的線性搜索中執行。

這是正確的嗎? 我在實施中做錯了嗎?

** * ** * ** * ** * *** 編輯 * ** * ** * ** * ** * ** * *

我只是想確保我正確使用這些東西。 這就是我正在做的事情:

public class LinkedListTest {

    private List<String> Names;

    public LinkedListTest(){
            Names = new LinkedList<String>();
    }

然后我只使用鏈表列表方法,即“Names.add(strings)”。 當我測試arraylists時,它幾乎相同:

public class ArrayListTest {

    private List<String> Names;

    public ArrayListTest(){
            Names = new ArrayList<String>();
    }

我做得對嗎?

恩,那就對了。 LinkedList必須在每次插入時進行內存分配,而允許ArrayList執行更少的內存分配,從而使其分攤O(1)插入 內存分配看起來很便宜,但實際上可能非常昂貴。

由於引用的局部性, LinkedList的線性搜索時間可能較慢: ArrayList元素更靠近,因此緩存未命中次數較少。

當您計划僅在List的末尾插入時, ArrayList是選擇的實現。

請記住:

  • 對於給定數量的元素,以及不同結構如何擴展“原始”性能存在差異;
  • 不同的結構在不同的操作中表現不同,這基本上是在選擇使用哪種結構時需要考慮的部分。

因此,例如,鏈接列表在添加到結尾時還有更多工作要做,因為它有一個額外的對象來分配和初始化每個項目添加,但無論每個項目的“內在”成本如何,兩個結構都將具有O(1)添加到列表末尾的性能,即無論列表的大小如何,每次添加都有一個有效的“常量”時間,但是該列表與ArrayList之間的常量會有所不同,后者可能會更大。

另一方面,鏈表有恆定的時間用於添加到列表的開頭,而在ArrayList的情況下,元素必須“shuftied”,這是一個需要花費一些時間與元素數量成比例的操作。 但是,對於給定的列表大小,比如100個元素,“shufty”100個元素可能比分配和初始化鏈表的單個占位符對象更快(但是當你到達時,比如,一千或一百萬個物體或任何閾值,它不會是)。

因此,在您的測試中,您可能希望同時考慮給定大小的操作的“原始”時間以及這些操作隨着列表大小的增長而擴展

將一個元素添加到LinkedList的后面時(在Java LinkedList中實際上是一個雙向鏈表),它是一個O(1)操作,就像在它前面添加一個元素一樣。 在第i個位置添加元素大致是O(i)操作。

因此,如果您要添加到列表的前面,則LinkedList會明顯更快。

為什么你認為LinkedList會更快? 在一般情況下,插入數組列表只是更新單個數組單元的指針(使用O(1)隨機訪問)的情況。 LinkedList插入也是隨機訪問,但必須分配一個“單元”對象來保存條目,並更新一對指針, 以及最終設置對正在插入的對象的引用。

當然,可能需要定期調整ArrayList的后備陣列(如果選擇具有足夠大的初始容量,則不會出現這種情況),但由於陣列呈指數級增長,因此攤銷成本將會很低,並且受到限制O(lg n)復雜性。

簡單地說 - 插入數組列表要簡單得多,因此總體來說要快得多。

在這些情況下,鏈接列表可能比數組列表慢,原因有幾個。 如果要插入列表的末尾,則陣列列表可能已經分配了此空間。 底層數組通常以大塊的形式增加,因為這是一個非常耗時的過程。 因此,在大多數情況下,在后面添加元素只需要粘貼在引用中,而鏈表需要創建節點。 在前面和中間添加應該為兩種類型的列表提供不同的性能。

在基於數組的列表中,列表的線性遍歷總是更快,因為它必須只能正常遍歷數組。 這需要每個單元一次解除引用操作。 在鏈表中,列表中的節點也必須被解除引用,占用的時間加倍。

ArrayList訪問隨機索引數據的速度更快,但在列表中間插入元素時速度較慢,因為使用鏈表只需更改參考值。 但是在數組列表中,您必須在插入的索引后復制所有元素,后面有一個索引。

編輯:是不是有一個鏈表實現保持最后一個元素? 這樣做會加快使用鏈表的插入速度。

暫無
暫無

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

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