确认Java LinkedList“foreach”循环

时间:2012-06-15 01:26:43

标签: java for-loop foreach containers

美好的一天,

有人可以确认帖子底部的内容java - iterating a linked list 帖子提到您可以使用 for(char c:linkedlistofchars)语法,它仍然是O(n)。我想要访问一个看起来像这样的列表......

a b c d e f

实际上会在for循环的每次迭代期间在链表的开始处运行,就像这样......

a ab abc abcde abcdef 

导致访问时间不是O(n)。

究竟是如何运作的?使用数组和数组运算符是有意义的,但java语法如何知道如何使用java中的 foreach 循环遍历链表?

我认为LinkedList数据结构只是一个额外的库,而不是核心语言语法的一部分。 (我确实知道LinkedList类在java中是标准的)

我希望我能够清楚地解释我的担忧....谢谢

2 个答案:

答案 0 :(得分:10)

首先,任何实现Iterable的类的实例都可以在foreach循环中使用。原因是编译后,for (Suit suit : suits)实际上变为for (Iterator i = suits.iterator(); i.hasNext(); )。有关详细信息,请参阅this explanation

集合实现了特定于数据结构的优化迭代器。具体到LinkedList,迭代器保留指向最后返回对象的指针,以允许恒定时间next()previous()操作。因此,使用foreach-loop迭代链表将导致O(n)时间复杂度。您可以查看源代码以获取更多详细信息。

答案 1 :(得分:2)

此链接demonstrates the difference的代码示例。该链接的OP错误:调用list.get(i)每次都会从列表的开头开始,然后计算到达i,而iterator.next()会将您的位置保存在列表中,所以每次调用时它只需要读取下一个值,而不是0和n之间的所有值。