答案在 Java 语言规范中,不需要反编译 :) 这是我们可以阅读的关于增强的 for 语句的内容:
增强的 for 语句具有以下形式:
EnhancedForStatement:
for ( VariableModifiersopt Type Identifier: Expression) Statement
表达式必须具有类型
Iterable
,否则它必须是数组类型(第 10.1 节),否则会发生编译时错误。
在增强for
语句(第 14.14 节)的 FormalParameter 部分中声明的局部变量的范围是包含的语句
增强语句的含义for
通过翻译成基本for
语句来给出。
如果 的 类型Expression
是 的子类型Iterable
,则令I
为表达式
Expression 的类型。iterator()
. 增强for
语句等价于for
以下形式的基本语句:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt Type Identifier = #i.next();
Statement
}
where#i
是一个编译器生成的标识符,它与增强 for 语句发生时范围内(第 6.3 节)内的任何其他标识符(编译器生成的或其他标识符)不同。
否则,表达式必须具有数组类型,T[]
。让L1 ... Lm
是紧接在增强for
语句之前的(可能为空的)标签序列。那么增强的for语句的含义由以下基本for
语句给出:
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt Type Identifier = a[i];
Statement
}
其中a和i是编译器生成的标识符,与增强 for 语句发生时范围内的任何其他标识符(编译器生成或其他)不同。
在您的情况下,myMap.keySet()
返回一个子类型,Iterable
因此您的增强for
语句等效于以下基本for
语句:
for (Iterator<String> iterator = myMap.keySet().iterator(); iterator.hasNext();) {
String key = iterator.next();
System.out.println(key);
System.out.println(myMap.get(key));
}
因此myMap.keySet()
只被调用一次。