循环的简写是否缓存了iterable的引用?

Str*_*hua 7 java performance for-loop

我可能试图过度效率,但我一直想知道以下两个代码示例中的哪一个会更快地执行.

假设你要它包含一个对象的引用ArrayListStrings,你想通过该列表进行迭代.以下哪项更有效(即使只是略有不同)?

for(String s : foo.getStringList())
    System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

要么

ArrayList<String> stringArray = foo.getStringList();
for(String s : stringArray)
    System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

如您所见,第二个循环初始化对列表的引用,而不是每次迭代都调用它,因为它似乎是第一个示例.除非这个概念完全不正确,并且它们都以相同的方式运行,因为Java的内部工作方式创建了自己的引用变量.

所以我的问题是,它是什么?

tha*_*guy 8

没有区别,因为两个循环最终只能在循环开始时获取并维护对表达式的Iterator的引用.以下是Java语言规范的摘录:

增强的for语句相当于表单的基本for语句:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiersopt TargetType Identifier =
        (TargetType) #i.next();
    Statement
}
Run Code Online (Sandbox Code Playgroud)