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循环Java错误ArrayIndexOutOfBoundsException