2014-06-17 81 views
2

我在字符串列表中的元素进行迭代对象后,其他 之一:增强功能如何增强 - for循环?

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)为环保持指针,其中它的最后已并且因此下面循环的复杂性为O(n)?

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

如果情况(b)以上 - 我认为这是 - 是有任何优点使用列表上进行迭代的迭代的。这是简单的迭代 - 不会有返回&。编辑:..和我的列表操作是只读的。

TIA。

+1

列表中使用它可以增强....现在,我再次看了你的问题,什么都没有。我会删除。我对失明表示歉意。 – awksp

回答

3

您称之为“增强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循环更好。

+0

@Kyllopardiun从问题来看,OP已经理解了'Iterator'和循环索引之间的区别。 –

0

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

0

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

在你的情况下,你有一个链接列表(它保留指向下一个前面的项目),所以通过使用增强的for(iterator),你的顺序读取复杂度为O(1)

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

所以,如果在连续读取复杂<随机读取复杂

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