10

当它调用一个方法时,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方法接受一个字符串并返回一个集合。

谢谢你。

4

5 回答 5

9

根据声明的Java 语言规范enhanced for表达式:

for ( FormalParameter : Expression ) Statement

执行如下:

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

因此,Expression(必须是 type Iterable)只有iterator()一次调用它的方法。

于 2013-01-10T02:26:39.510 回答
3

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

像这样:

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

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

于 2013-01-10T02:25:47.383 回答
2

如果我们编译这个测试

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();
于 2013-01-10T05:17:53.580 回答
1

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

于 2013-01-10T02:24:00.993 回答
1

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

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

while(input.hasNext())

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

于 2013-01-10T02:27:10.943 回答