关于java:for-each循环如何工作?

How does a for-each loop work?

本问题已经有最佳答案,请猛点这里访问。

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

例:

1
2
3
4
5
6
for(String permutation : permute(remaining))
    {  

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

顺便说一下,方法permute接受一个String并返回一个set。

谢谢。


根据enhanced for语句的Java语言规范,表达式:

1
for ( FormalParameter : Expression ) Statement

执行如下:

1
2
3
4
5
for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiersopt TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

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


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

像这样:

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

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


如果我们编译这个测试

1
2
3
4
5
6
7
class Test {
    public static void main(String[] args) throws Exception {
        Set<String> set = new HashSet<>();
        for (String s : set) {
        }
    }
}

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

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

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

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

1
while(input.hasNext())

这是你可以在无限数量读取的项目中看到的东西。必须先评估表达式input.hasNext(),然后循环。


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