【发布时间】:2014-11-03 22:13:57
【问题描述】:
我一直在检查 for each 与 Iterator 在通过程序遍历 LinkedList 时的性能:
public class ListTraversePerformance {
public static void main(String... args){
List<String> list = new LinkedList<String>();
for(int i=0;i<100000;i++){
list.add("Any String" + i);
}
Iterator i = list.iterator();
String x;
long t1 = System.currentTimeMillis();
for(String j: list){
x = j;
}
long t2 = System.currentTimeMillis();
while(i.hasNext()){
x= (String)i.next();
}
long t3 = System.currentTimeMillis();
System.out.print((t2-t1) + " " + (t3-t2));
}
}
我得到的输出每次都不同,即有时第一个循环运行得很快,有时第二个。
我的问题:
我认为 for each 循环的运行速度应该比第二个 Iterator 慢。我认为在for each 循环中,与O(n) 的Iterator 的复杂性相比,链表每次都应该从头开始遍历,使其复杂性O(n^2)。我对么?如果是,那么为什么结果不符合我的预期......
【问题讨论】:
-
LinkedList 总是从起始节点遍历到结束。
-
不,你不正确。 foreach 循环不需要每次都从头开始迭代。
-
@JunedAhsan 我有一个想法,我的问题是为什么 for each 循环运行不慢。
-
@sagar 不同的执行会给你不同的执行时间,即使对于同一段代码,取决于当前的 cpu 状态。简而言之,两种情况之间没有时间复杂度差异,因为链表总是从头到尾遍历。
-
k,我明白了,谢谢.. @JunedAhsan
标签: java collections foreach linked-list iterator