ArrayList v.s. LinkedList - 插入时间

时间:2012-08-22 13:38:30

标签: java collections

当我分别跑步时:

package containers;

import java.util.*;

    public static void main(String[] args) {

    List<Integer> arLst = new ArrayList<Integer>();
    List<Integer> lnLst = new LinkedList<Integer>();

    long start = System.currentTimeMillis();

    for (int i = 0; i < 10000000; i++) {
        arLst.add(i);
    }

    System.out.println("Array list: "+Long.toString(System.currentTimeMillis()-start));

    start = System.currentTimeMillis();

    for (int i = 0; i < 10000000; i++) {
        lnLst.add(i);
    }

    System.out.println("Linked list: "+Long.toString(System.currentTimeMillis()-start));
}

我的执行时间大致相同。 我知道LinkedList的添加时间应该更快。 我想知道为什么..(对于中间插入和最后一个elemnt都是有意义的 - 因为数组在O(1)中知道要插入的位置,不像LinkedList那样必须通过整个列表,我记得。)

5 个答案:

答案 0 :(得分:4)

两个列表都知道列表末尾的位置,因此插入时间几乎相同。我希望LinkedList稍慢,因为它为每个元素创建一个节点并使用更多内存。

我得到了

TIntArrayList - 141 ms
ArrayList<Integer> - 810 ms
LinkedList<Integer> - 5190 ms.

TIntArrayList不会更有效地使用缓存为每个元素创建一个对象。

答案 1 :(得分:4)

您的列表都是ArrayList ...如果您将其更改为LinkedList,您也不会发现任何重大差异。按照您的方式构建ArrayList,每次插入都会分摊O(1)的复杂性。

答案 2 :(得分:3)

您的代码与您的解释不同。但是,这是您的问题的答案:

ArrayList Vs LinkedList

答案 3 :(得分:2)

Ammm .... 也许这个:

List<Integer> lnLst = new ArrayList<>();

应如下所示:

List<Integer> lnLst = new LinkedList<>();

我无法理解你想要衡量的是什么。我认为您要测量add性能,然后您的代码应如下所示:

    public static void main(String[] args) {

        List<Integer> arLst = new ArrayList<Integer>();
        List<Integer> lnLst = new LinkedList<Integer>();

        long start = System.currentTimeMillis();

        for (int i = 0; i < 10000000; i++) {
            arLst.add(i);
        }

        System.out.println("Array list: "+Long.toString(System.currentTimeMillis()-start));

        start = System.currentTimeMillis();

        for (int i = 0; i < 10000000; i++) {
            lnLst.add(i);
        }

        System.out.println("Linked list: "+Long.toString(System.currentTimeMillis()-start));
    }

答案 4 :(得分:0)

  

...因为数组在O(1)中知道要插入的位置,而不像LinkedList那样   我记得,仔细阅读整个清单。

这不正确。数组(不是ArrayLists)没有恒定的插入时间,Java的ArrayList 技术上也没有(添加操作在分摊的常量时间中运行)。

此外,将元素插入链接列表是O(1)

  

除了实现List接口之外,还有LinkedList类   提供统一命名的方法来获取,删除和插入元素   在列表的开头和结尾。

如果要插入排序列表,复杂性将变为O(N)