【问题标题】:How does a for-each loop work? [duplicate]for-each 循环如何工作? [复制]
【发布时间】: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 表示你实际上试图理解你的家庭作业是什么。

标签: java recursion for-loop foreach


【解决方案1】:

根据Java Language Specificationenhanced for语句,表达式:

for ( FormalParameter : Expression ) Statement

执行如下:

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

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

【讨论】:

【解决方案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() 必须先被求值,然后你可以循环。

    【讨论】:

    • 感谢您的回答。 :)
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多