0

我想知道使用方法调用作为获取集合的 foreach 参数的性能。让我们看一个例子:

for (Entry<K, V> entry : map.entrySet()) {
    doing.stuff();
}

我想JVM在开始循环之前只会调用一次map.entrySet(),获取第一个元素,获取他的迭代器并对其进行迭代,不再调用map.entrySet(),或者如果数组只是使用本地创建的迭代它int 迭代器(或类似的东西),但我不知道 JVM 是如何工作的,所以我想确定 - 它是否以这种方式工作,或者最好在循环之前保存集合并将其作为本地 var 传递,而不是调用循环内的吸气剂?

4

2 回答 2

6

来自Java 语言规范:增强的 for 语句

增强的 for 语句具有以下形式:

    for ( FormalParameter : Expression ) Statement

增强的 for 语句等效于以下形式的基本 for 语句:

    for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt TargetType Identifier =
            (TargetType) #i.next();
        Statement
    }

基于此,该map.entrySet()集合将仅被检索一次

于 2013-04-23T05:34:33.650 回答
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);
}
于 2013-04-23T05:49:18.453 回答