【问题标题】:Why looping an Add operations in LinkedList takes longer than ArrayList?为什么在 LinkedList 中循环添加操作比 ArrayList 需要更长的时间?
【发布时间】:2020-11-17 12:35:27
【问题描述】:

所以我知道当主要操作是add 时,LinkedList 应该快得多(与ArrayList 相比),因为它不需要复制用完空槽的数组。

here 所述:

使用 LinkedList 的另一个好处是当您从列表的头部添加或删除时,因为这些操作是 O(1),而对于 ArrayList,它们是 O(n)。

所以我创建了这个小程序来对其进行基准测试。令我惊讶的是,它反过来了,所以ArrayList 更快。这似乎违反直觉。

我不确定我在这里缺少什么:

    public static void main(String[] args) {

    for (int i = 1000; i < 100000000; i *=5) {
        System.out.println(" - - - - ");
        System.out.println("size " + NumberFormat.getNumberInstance(Locale.US).format(i));
        List<Integer> list = new ArrayList<>();
        populateList(list, i);
        list = null;

        List<Integer>list2 = new LinkedList<>();
        populateList(list2, i);
    }

}

private static void populateList(List<Integer> list, long size) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < size; i++) {
        list.add(i);
    }
    long after = System.currentTimeMillis();
    System.out.println(list.getClass().getCanonicalName() + " Diff: " + (after - start));
}

输出是:


大小 1,000

java.util.ArrayList 差异:0

java.util.LinkedList 差异:0


大小 5,000

java.util.ArrayList 差异:1

java.util.LinkedList 差异:0


大小 25,000

java.util.ArrayList 差异:3

java.util.LinkedList 差异:2


大小 125,000

java.util.ArrayList 差异:5

java.util.LinkedList 差异:4


大小 625,000

java.util.ArrayList 差异:20

java.util.LinkedList 差异:13


大小 3,125,000

java.util.ArrayList 差异:104

java.util.LinkedList 差异:1254


大小 15,625,000

java.util.ArrayList 差异:3274

java.util.LinkedList 差异:4490


大小 78,125,000

java.util.ArrayList 差异:14457

java.util.LinkedList 差异:88370

【问题讨论】:

  • 你没有像你说的那样添加到链表的头部。

标签: java arraylist linked-list performance-testing


【解决方案1】:

您将插入到ArrayListLinkedList 都是O(1) 的列表末尾,因为 LinkedList 实现是一个双向链表,它也有一个尾指针。

要在头部插入,也要传递索引。

list.add(0, i);

另见:How do I write a correct micro-benchmark in Java?

【讨论】:

    猜你喜欢
    • 2021-03-23
    • 1970-01-01
    • 2011-12-27
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2015-04-10
    • 1970-01-01
    相关资源
    最近更新 更多