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 接受一个字符串并返回一个集合。
谢谢。
答案 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();