每次进入foreach循环时Java会创建一个新对象吗?我不是在谈论每次迭代,但是如果您有一个多次使用的 foreach 循环,那么它是否每次都在创建对象?
简单示例:
for(Object o : Objects)
{
for(Object p : Objects2)
{
}
}
每次执行只会有一个p
,还是会p
为每个实例化Object o
?每次退出时,垃圾收集器是否必须从 foreach 循环中恢复对象?
更具体地说,我正在编写一些基于 Android 的游戏代码。它将以每秒给定的速率迭代所有游戏对象,或者根据情况尽可能快地迭代。
这可能是过早优化的情况,但如果使用显式for
或while
循环可以保证我不会从循环中收集过多的垃圾,那么我可以将其确立为项目的编码标准。
进一步来说:
public void update()
{
for(GameObject gObj : gameObjects)
{
gObj.update();
}
}
从update()
一个线程调用,该线程旨在根据我之前描述的时间进行调用。
更新:
我问是否p
为每个o
in创建了一个新的参考Objects
。如果它将对象复制到Objects2
. 那么虚拟机是否必须创建一个新的 Reference p
,然后它是否会在外循环的迭代之间收集该引用?更具体地说,在我的情况下,它是否收集方法调用之间的引用?
更新: 来自对 Matt Ball 答案的评论。哪个会减少垃圾收集工作?
//Loop just to have it run a number of times
//Could be running the inner foreach numerous time for any reason
for(int i = 0; i < 1000; i++)
{
for(Object o : Objects)
{
o.update();
}
}
对比
Iterator<Object> iter;
//Loop just to have it run a number of times
//Could be running the inner foreach numerous time for any reason
for(int i = 0; i < 1000; i++)
{
iter = Objects.iterator();
while(iter.hasNext());
{
iter.getNext().update();
}
}
更新: 比较范围:
import java.util.ArrayList;
import java.util.Iterator;
public class TestLoops
{
public static Iterator<Object> it;
public static ArrayList<Object> objects;
public static void main(String... args)
{
objects = new ArrayList<Object>();
it = objects.iterator();
it = objects.iterator();
//Every time we start a foreach loop, does it creates a new reference?
Iterator<Object> newIt1 = objects.iterator();
Iterator<Object> newIt2 = objects.iterator();
}
}
产生这个字节码:
public class TestLoops {
public static java.util.Iterator<java.lang.Object> it;
public static java.util.ArrayList<java.lang.Object> objects;
public TestLoops();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: putstatic #4 // Field objects:Ljava/util/ArrayList;
10: getstatic #4 // Field objects:Ljava/util/ArrayList;
13: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
16: putstatic #6 // Field it:Ljava/util/Iterator;
19: getstatic #4 // Field objects:Ljava/util/ArrayList;
22: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
25: putstatic #6 // Field it:Ljava/util/Iterator;
28: getstatic #4 // Field objects:Ljava/util/ArrayList;
31: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
34: astore_1
35: getstatic #4 // Field objects:Ljava/util/ArrayList;
38: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
41: astore_2
42: return
}