【问题标题】:How enhanced is enhanced-for loop?增强型for循环的增强程度如何?
【发布时间】:2014-06-17 22:10:49
【问题描述】:

我正在迭代 String 对象列表的元素 一个接一个:

LinkedList list;

// add values to the list here


for (int i = 0; i < list.size(); i++)  
    System.out.println(list.get(i));

在这里,每次我在列表上调用 get() 时,列表都会从它的一端一直迭代到第 i 个元素——所以上述循环的复杂度是 O(n^2 )。

是 a.) 与上面的增强 for 循环相同,或者 b.) 是 for 循环维护它最后所在的指针,因此下面循环的复杂度是 O(n)?

for (String s:list)   
    System.out.println(s);

如果上面的情况(b)——我认为是——在列表中使用迭代器是否有任何优势。这是简单的迭代——没有来回。编辑:..我的列表操作是只读的。

TIA。

【问题讨论】:

  • ....现在我再次阅读了您的问题,什么也没有。我会删除。我很抱歉我失明了。

标签: java list foreach iterator time-complexity


【解决方案1】:

您所称的“增强型 for 循环”(实际上称为 foreach 循环)在内部对任何可迭代对象(包括链表)使用迭代器。

换句话说,它是 O(n)

它确实通过使用整数来处理数组循环并以这种方式对其进行迭代,但这很好,因为它在数组中表现良好。

手动使用迭代器的唯一优点是,如果您需要在迭代时删除部分或全部元素。

【讨论】:

    【解决方案2】:

    像这样的foreach 循环:

    for (String s:list)   
        System.out.println(s);
    

    会变成类似的东西

    for(Iterator<String> iter = list.iterator(); iter.hasNext();) {
        String s = iter.next();
        System.out.println(s);
    }
    

    即它相当于使用Iterator。而且比使用标准的for 循环要好得多。

    【讨论】:

    • @Kyllopardiun 从问题中,OP 已经了解 Iterator 和按索引循环之间的区别。
    【解决方案3】:

    如果是关于列表的增强循环在幕后使用迭代器 [1]。

    在您的情况下,您有一个链表(它保存指向下一个上一个项目的指针),因此通过使用增强的 for(迭代器),您可以获得顺序读取复杂性 O(1)

    如果您使用建议的 for,您将随机访问您的列表,对于 LinkedList,它是 O(n),但如果它是一个 ArrayList,它将是 O(1)

    所以如果在具有顺序读取复杂度

    [1]why is enhanced for loop efficient than normal for loop

    【讨论】:

      【解决方案4】:

      增强的 for 循环在某些情况下很有用,例如当需要在数组中搜索一个键时,它会按顺序一次获取一个元素。无需建立循环计数器,指定起始值和结束值。因此可以根据需要使用简单的for循环或增强的for循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-23
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 2020-02-06
        相关资源
        最近更新 更多