为什么在linkedlist中循环add操作要比arraylist花费更长的时间?

w8ntj3qf  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(256)

所以我知道 LinkedList 应该快得多(与 ArrayList )当主操作是 add 因为它不需要复制耗尽空插槽的数组。
如本文所述:
使用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));
}

输出为:
尺寸1000
java.util.arraylist差异:0
java.util.linkedlist差异:0
尺寸5000
java.util.arraylist差异:1
java.util.linkedlist差异:0
尺寸25000
java.util.arraylist差异:3
java.util.linkedlist差异:2
尺寸125000
java.util.arraylist差异:5
java.util.linkedlist差异:4
尺寸625000
java.util.arraylist差异:20
java.util.linkedlist差异:13
尺寸3125000
java.util.arraylist差异:104
java.util.linkedlist差异:1254
尺寸1565000
java.util.arraylist差异:3274
java.util.linkedlist差异:4490
尺寸78125000
java.util.arraylist差异:14457
java.util.linkedlist差异:88370

pinkon5k

pinkon5k1#

您正在向列表的末尾插入 ArrayList 以及 LinkedListO(1) 因为linkedlist实现是一个双链表,它也有一个尾部指针。
要在头部插入,请同时传递索引。

list.add(0, i);

另请参阅:如何用java编写正确的微基准测试?

相关问题