java中ArrayList和LinkedList的性能基准

时间:2014-03-11 09:41:35

标签: java performance arraylist linked-list

阅读完[问题]:When to use LinkedList over ArrayList?后,我尝试对ArrayList和LinkedList的性能进行基准测试。但我发现的结果与答案截然不同。就add()而言,ArrayList性能比LinkedList好2-3倍。 据我所知 LinkedList.add(E元素)是O(1)< --- LinkedList的主要好处 ArrayList.add(E元素)是O(n - 索引) 但结果表明,Array列表比LinkedList快得多

任何人都可以解释一下这种行为

 public static void main(String[] args) {
    long start = System.currentTimeMillis();
    List<Integer> b = new LinkedList<Integer>();
    for (int i = 0; i < 1000000; i++) {
        b.add(i);
    }
    System.out.println(System.currentTimeMillis() - start);

    start = System.currentTimeMillis();
    List<Integer> a = new ArrayList<Integer>();
    for (int i = 0; i < 1000000; i++) {
        a.add(i);
    }
    System.out.println(System.currentTimeMillis() - start);

}

2 个答案:

答案 0 :(得分:0)

你很困惑。在List的末尾添加元素是O(1)都是列表。

ArrayList的唯一例外情况是当达到列表的容量时,会强制ArrayList实例化一个新数组并将所有元素从旧数组复制到新数组。但这很少发生,因为每次完成时容量乘以1.5。

在两种情况下,在列表中间添加元素是O(N)。 LinkedList必须迭代(从结束开始),直到找到必须插入新节点的位置。 ArrayList必须将所有元素从插入索引移到结尾。

答案 1 :(得分:0)

您只测试列表的append属性。

ArrayListLinkedList是列表的具体实现。在一天结束时,您的基准目的是确定哪种列表更适合哪种情况。这就是 有效基准 尝试针对all the new operations and stipulations provided by the List interface测试两种实现的原因。