Java Foreach参数性能

Java Foreach参数性能,java,performance,foreach,Java,Performance,Foreach,我想知道使用方法调用作为获取集合的foreach参数的性能。让我们看一个例子: for (Entry<K, V> entry : map.entrySet()) { doing.stuff(); } for(条目:map.entrySet()){ doing.stuff(); } 我假设JVM在开始循环之前只调用map.entrySet()一次,取第一个元素,取他的迭代器并对其进行迭代,再也不会调用map.entrySet(),或者如果数组只是用本地创建的int迭代器(或

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

for (Entry<K, V> entry : map.entrySet()) {
    doing.stuff();
}
for(条目:map.entrySet()){
doing.stuff();
}
我假设JVM在开始循环之前只调用map.entrySet()一次,取第一个元素,取他的迭代器并对其进行迭代,再也不会调用map.entrySet(),或者如果数组只是用本地创建的int迭代器(或类似的东西)对其进行迭代,但我不知道JVM是如何工作的,所以我想确定——它是这样工作的吗,或者最好在循环之前保存集合并将其作为本地变量传递,而不是在循环中调用getter?

来自:

增强型for语句的形式如下:

增强型for语句相当于以下形式的基本for语句:

基于此,
map.entrySet()
集合将从以下位置检索一次

for(Object e : collection) {
}
增强型for语句的形式如下:

增强型for语句相当于以下形式的基本for语句:

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

for(Object e : collection) {
}
相当于

Iterator i = collection.iterator();
while(i.hasNext()) {
    Object e = i.next();
}
因此它涉及到迭代器对象的创建。除了迭代器之外,next()还涉及对并发修改的额外检查。因此,在
ArraList
的情况下,通过索引访问元素可能更有效

for(int i = 0; i < list.size(); i++) {
    Object e = list.get(i);
}
for(int i=0;i
相当于

Iterator i = collection.iterator();
while(i.hasNext()) {
    Object e = i.next();
}
因此它涉及到迭代器对象的创建。除了迭代器之外,next()还涉及对并发修改的额外检查。因此,在
ArraList
的情况下,通过索引访问元素可能更有效

for(int i = 0; i < list.size(); i++) {
    Object e = list.get(i);
}
for(int i=0;i
请参阅此方法的唯一问题是,如果
list
LinkedList
list
的另一个实现,它不使用数组,则
get(int index)
方法可以遍历整个列表以获取最后一个元素。这种方法唯一的问题是,如果
list
LinkedList
或另一个不使用数组的
list
实现,则
get(int index)
方法可以遍历整个列表以获取最后一个元素。