如何增强for-loop?

时间:2014-06-17 22:10:49

标签: java list foreach iterator time-complexity

我正在迭代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) )。

是一个。)与上面的增强型for循环一样,或者b。)是for循环保持指针的最后位置,因此下面循环的复杂性是O(n)?

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

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

TIA。

4 个答案:

答案 0 :(得分:2)

你称之为“增强for循环”(它实际上称为foreach循环)在内部使用迭代器来处理任何可迭代的东西 - 包括链接列表。

换句话说,它是O(n)

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

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

答案 1 :(得分: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循环要好得多。

答案 2 :(得分:1)

如果是关于列表的话,增强型循环使用幕后的{I {I {{{}}}。

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

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

因此,如果在具有顺序读取复杂度的列表中使用它,则可以增强它。随机读复杂性

[1] 1

答案 3 :(得分:0)

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