【发布时间】:2013-10-12 11:52:27
【问题描述】:
我正在阅读When to use LinkedList over ArrayList? 中指出的ArrayList 和LinkedList 之间的差异。我开发了一个小示例应用程序来测试LinkedList 的主要优势,但我得到的结果并不能证实LinkedList 在操作性能上胜过ArrayList:
ListIterator.add(E element)
这是我的代码:
public static void main(String[] args) {
int number = 100000;
long startTime1 = System.currentTimeMillis();
fillLinkedList(number);
long stopTime1 = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
fillArrayList(number);
long stopTime2 = System.currentTimeMillis();
System.out.println(" LinkedList needed: "+ (stopTime1 - startTime1));
System.out.println(" ArrayList needed: "+ (stopTime2 - startTime2));
}
public static void fillLinkedList(int number){
LinkedList<Integer> list = new LinkedList<Integer>();
ListIterator<Integer> it = list.listIterator();
int i = 0;
while(i++<number){
it.add(i);
}
// System.out.println("LinkedList size: "+list.size());
}
public static void fillArrayList(int number){
ArrayList<Integer> list = new ArrayList<Integer>();
ListIterator<Integer> it = list.listIterator();
int i = 0;
while(i++<number){
it.add(i);
}
// System.out.println("ArrayList size: "+list.size());
}
测量结果:
number 10,000 100,000 500,000 1,000,000 5,000,000
ArrayList 7 17 60 77 170
LinkedList 7 21 89 838 4127
我注意到元素的增加显着削弱了LinkedList 的性能,而ArrayList 表现出明显更好的行为。我理解错了吗?
【问题讨论】:
-
请注意,对于
LinkedList,您需要为每次插入创建一个Node对象。使用ArrayList,您必须扩大阵列。 -
你什么都明白。 Stack Overflow 充满了...
-
对于未来的测量,您可能应该使用
System.nanoTime()而不是System.currentTimeMillis(),因为后者的精度要低得多,而且您实际上并不是在这里测量当前时间,而是 2 之间的差异点。 -
如果先填充ArrayList,再填充LinkedList,那么结果就大不一样了。 ArrayList 仍然大部分获胜,但更接近。
-
在这种情况下,为什么你认为
LinkedList应该比ArrayList快?我在引用的问题中看不到任何支持这一假设的内容。LinkedList和ArrayList具有相同的附加渐近摊销行为。但是,后者的常数因子要小得多。
标签: java arraylist linked-list listiterator