java - 哪个性能更好: for each or iterator in LinkedList?

标签 java collections foreach linked-list iterator

我一直在检查 foreachIterator 在通过程序遍历 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));
    }
}

我每次得到的输出都是不同的,即有时第一个循环运行得很快,有时第二个循环运行得很快。

我的问题:

我认为foreach循环应该比第二个迭代器运行得慢。我认为在 for every 循环中,链表每次都应该从头开始遍历,使其复杂度 O(n^2)O(n) 迭代器的复杂性。我对么?如果是的话为什么结果不符合我的预期......

最佳答案

两者几乎是等价的,而且它们的复杂度都是 O(n),因为每个元素都被精确地迭代一次。都不重复迭代。

foreach循环在底层使用了一个迭代器。它是对实现 Iterable 的对象进行迭代的语法糖。 ,这又创建了一个迭代器。因此,当我说两者几乎相同时,我的意思是字面意思。

正确进行微观基准测试非常困难。最大的问题是,我们最终认为我们正在为一件事计时,但实际上我们正在为另一件事计时;需要进行大量挖掘才能将其全部拆开才能了解到底发生了什么。请阅读以下相关帖子的答案,它将解释为什么时间差异如此之大,以及如何处理它。 Why are floating point operations much faster with a warmup phase? 。该问题的 SO 与您自己对基准的观察几乎相同,仅使用浮点运算而不是列表迭代。

简单总结是 1) JVM 通过解释器开始执行代码,并动态优化代码的热点区域,2) GC 和其他后台进程可能会干扰,有些可能在 JVM 中,有些可能在 JVM 之外JVM 的。

关于java - 哪个性能更好: for each or iterator in LinkedList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25762437/

相关文章:

javascript - 二维数组中增强的 for 循环 - JavaScript

java - 如何呈现对象数组,就像另一个对象数组一样

java - 嵌套映射结构

java jsp if语句

java - 如果我们有原始的,为什么我们可以更改不可修改的列表?

java - 为什么CopyOnWriteArrayList在写入时会复制?

grails + 获取 g :each 中的下一个值

regex - 处理单个和多个单词字符串

java - 如何设置 IntelliJ Idea 来运行简单的 java 应用程序?

java - Windows 8 中的 Apache Maven 安装