所以我知道 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
1条答案
按热度按时间pinkon5k1#
您正在向列表的末尾插入
ArrayList
以及LinkedList
是O(1)
因为linkedlist实现是一个双链表,它也有一个尾部指针。要在头部插入,请同时传递索引。
另请参阅:如何用java编写正确的微基准测试?