2016-09-20 54 views
-2

我在一段相當簡單的代碼中得到了奇怪的結果。 這裏是有問題的代碼:在Java中遍歷LinkedList vs ArrayList的運行時間

List<Integer> arrayList = new ArrayList<Integer>(6200000); 
    List<Integer> linkedList = new LinkedList<Integer>(); 

    for (int i = 0; i < 6200000; i++) 
    { 
     arrayList.add(i); 
    } 

    long startTime = System.currentTimeMillis(); 
    for (int i = 0; i < 6200000; i++) 
    { 
     linkedList.add(i); 
    } 
    System.out.println(System.currentTimeMillis() - startTime); 

現在,這裏的問題是: 當大小在 給出參數的ArrayList CTOR,爲「新的ArrayList(6200000)」,印刷值是總是大於2000. 當ArrayList CTOR沒有給出大小時,如 「new ArrayList()」,打印值爲1000或超過1000. 問題是多次執行給出不同的值,但是我的觀點是,這兩個描述的情景之間存在顯着差異,而我只是不在其中堅持原因。 ArrayList的構造方式如何影響與LinkedList相關的代碼? 有沒有人有線索?

謝謝!

+1

創建錯誤的基準可能會導致令人困惑的結果。 – Kayaman

回答

1

將節點添加到LinkedList時,會創建大量對象(每個值有兩個),因此您將強調內存分配器。當您創建一個非常大的數據結構時,您將首先關注內存大小的增長。在new ArrayList()的情況下,由於ArrayList不得不多次重新調整大小,因此最重要的是增長最多,就像導致更大的Eden大小加速短期對象一樣。當你運行這個測試來觀察內存如何增長時,我會觀察堆大小在做什麼。