for-each 循环如何工作? [复制]

Posted

技术标签:

【中文标题】for-each 循环如何工作? [复制]【英文标题】:How does a for-each loop work? [duplicate] 【发布时间】:2012-12-24 08:45:50 【问题描述】:

for-each 循环在调用方法时如何工作,无论是递归还是不同的方法?

例子:

for(String permutation : permute(remaining))
       

      // Concatenate the first character with the permutations of the remaining chars
      set.add(chars.charAt(i) + permutation);
    

顺便说一下, permute 方法接受一个字符串并返回一个集合。

谢谢。

【问题讨论】:

你为什么不在调试器中编写代码并逐步调试它,比如 Eclipse? 这与递归无关。 或者使用javap反汇编! +1 表示你实际上试图理解你的家庭作业是什么。 【参考方案1】:

根据Java Language Specification的enhanced for语句,表达式:

for ( FormalParameter : Expression ) Statement

执行如下:

for (I #i = Expression.iterator(); #i.hasNext(); ) 
    VariableModifiersopt TargetType Identifier =
        (TargetType) #i.next();
    Statement

因此,Expression(必须是 Iterable 类型)只调用一次其 iterator() 方法。

【讨论】:

@ user1965283:欢迎来到 SO。请采纳答案:***.com/faq【参考方案2】:

调用一次,存储结果,执行 foreach。

像这样:

Collection<String> temp = permute(remaining);
for(String permutation : temp) 
...

编辑:如果这是递归的,那真的没有区别。每一层递归都有自己的范围,因此也有自己的“临时”变量。因此 permute 函数将递归到最低层,然后每个更高层将依次执行其完全独立foreach循环。

【讨论】:

@user1965283 没问题,但不要忘记接受你喜欢的答案(应该是 ulmangt 的,因为他的答案比我的酷)【参考方案3】:

如果我们编译这个测试

class Test 
    public static void main(String[] args) throws Exception 
        Set<String> set = new HashSet<>();
        for (String s : set) 
        
    

然后用 JAD 反编译 Test.class,我们会看到 javac 用这段代码替换了 for-each

    Set set = new HashSet();
    String s;
    for(Iterator iterator = set.iterator(); iterator.hasNext();)
        s = (String)iterator.next();

【讨论】:

【参考方案4】:

Foreach 循环适用于实现Iterable 接口的任何类,并且只是在Iterator 上调用hasNext()next() 的语法糖。同线程同循环,函数调用一次。

【讨论】:

感谢您的回答。 :)【参考方案5】:

在您的示例中,permute(remaining) 的结果在进入循环之前 被评估。虽然增强的 for 循环实际上只不过是迭代器的语法糖,但它仍然遵循与其他循环相同的原则——它必须有一个集合来操作,然后才能执行其他任何操作。

一个更简单的例子是这样的:

while(input.hasNext())

您可能会在读取不定行数的项目中看到这种情况。表达式input.hasNext() 必须先被求值,然后你可以循环。

【讨论】:

感谢您的回答。 :)

以上是关于for-each 循环如何工作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

传统循环和 for-each 循环有啥区别? [复制]

有没有办法在 for-each 循环迭代开始之前避免空检查? [复制]

在 for-each 循环中复制动态范围

For-Each循环Java错误ArrayIndexOutOfBoundsException

对于不实现 Iterable 的类,如何使用 for-each 循环

如何使用 PySpark 进行嵌套的 for-each 循环