我想知道使用方法调用作为获取集合的foreach参数的性能。让我们看一下例子:
for (Entry<K, V> entry : map.entrySet()) {
doing.stuff();
}
我想JVM在启动循环之前只调用一次map.entrySet(),取第一个元素,取他的迭代器并迭代它,再也不调用map.entrySet(),或者在数组迭代时调用它使用本地创建的int迭代器(或者像那样),但我不知道JVM是如何工作的,所以我想确定 - 它是否以这种方式工作,或者更好地在循环之前保存集合并将其作为本地var传递,而不是在循环中调用getter?
答案 0 :(得分:6)
来自Java Language Specification: The enhanced for statement:
增强的for语句具有以下形式:
for ( FormalParameter : Expression ) Statement
增强的for语句相当于表单的基本for语句:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt TargetType Identifier =
(TargetType) #i.next();
Statement
}
基于此,map.entrySet()
集合将仅一次检索。
答案 1 :(得分:0)
for(Object e : collection) {
}
相当于
Iterator i = collection.iterator();
while(i.hasNext()) {
Object e = i.next();
}
所以它涉及Iterator对象的创建。除了Iterator.next()之外还需要额外检查并发修改。因此,在ArraList
的情况下,按索引访问元素可能更有效
for(int i = 0; i < list.size(); i++) {
Object e = list.get(i);
}