for-each循环如何工作?

时间:2013-01-10 02:22:15

标签: java recursion for-loop foreach

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 接受一个字符串并返回一个集合。

谢谢。

5 个答案:

答案 0 :(得分:9)

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

for ( FormalParameter : Expression ) Statement

执行如下:

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

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

答案 1 :(得分:3)

调用一次,存储结果,做到foreach。

像这样:

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

编辑:如果这是递归的,它确实没有区别。每一层递归都只有自己的范围,因此它自己的“临时”变量。因此,置换函数将递归到最低级别,然后每个更高级别将连续执行完全独立的 foreach循环。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

permute(remaining)

您可能会在无限期阅读的项目中看到这些内容。必须首先评估表达式while(input.hasNext()) ,然后循环。

答案 4 :(得分:1)

如果我们编译这个测试

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

并使用JAD反编译Test.class,我们将看到用这个代码替换了每个javac

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