我正在迭代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。
答案 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循环。