是否每次都为 Iterables 调用 for 循环的“条件”?

Posted

技术标签:

【中文标题】是否每次都为 Iterables 调用 for 循环的“条件”?【英文标题】:Is the "condition" of a for loop called each time for Iterables? 【发布时间】:2011-12-03 06:40:24 【问题描述】:

假设我有以下代码:

for (Object obj : Node.getIterable()) 
    //Do something to object here

并且 Node.getIterable() 返回一个可迭代对象。 getIterable() 函数是每次调用还是仅在 for 循环启动时调用?我应该将其更改为:

Iterable<Object> iterable = new Iterable<Object>();
//populate iterable with objects
for (Object obj : iterable) 
    //Do something

【问题讨论】:

简单的方法来找出...只需将 Node.getIterable 包装在一个方法中,该方法还可以将一些内容写入控制台(或者如果您愿意,可以写入文件)。然后你就可以看到它被调用了多少次。我的赌注 - 它只被调用一次,但我没有足够的信心给出明确的答案。 【参考方案1】:

Java 语言规范详细说明了 foreach 语句的作用。有关详细信息,请参阅“14.14.2 增强的 for 语句”(http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2)。但简而言之,实际上该语言确实保证您正在迭代的表达式只会被计算一次。

【讨论】:

【参考方案2】:

不,它没有。它将从getIterable() 接收到的可迭代项保存在内存中并使用该引用。快速检查的方法是在for 语句处设置一个断点并调试进入JDK 的方式。你会知道的。

【讨论】:

以上是关于是否每次都为 Iterables 调用 for 循环的“条件”?的主要内容,如果未能解决你的问题,请参考以下文章

方法的调用

判断单链表中是否有环(循环链表)

如何映射任意Iterables?

php foreach为啥比for效率高

Python语言程序设计之一--for循环中累加变量是否要清零

双向循环链表实现