如何增强for-loop?

我一个接一个地迭代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。

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

换句话说就是O(n)

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

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

像这样的foreach循环:

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

会不会像这样的东西

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

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

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

如果是关于列表的话,增强型循环在幕后使用Iterator [ 1 ]。

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

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

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

[1] 为什么循环效率比正常循环增强