Java ArrayList效率

Dan*_*her 2 java performance arraylist

我正在编写一个游戏,并有一个名为GameObject的抽象类和三个扩展它的类(玩家,墙和敌人).

我有一个列表定义为包含我游戏中的所有对象.

List<GameObject> objects;
Run Code Online (Sandbox Code Playgroud)

当我需要对对象执行某些操作时,我就是这样做的:

public void update() {
    for(GameObject o : objects) {
         if(o instanceof Wall) {
             // do something
         }
         else if(o instanceof Player) {
             // do something
         }

         else if(o instanceof Enemy) {
             // do something
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,我必须浏览整个列表并检查类型以找到只是找到一个对象.在我看来,这似乎并不是非常有效.所以我考虑将不同的派生类存储在自己的列表中.

private List<Wall> walls;
private List<Enemy> enemies;
private Player player; // only one
Run Code Online (Sandbox Code Playgroud)

这会更有效,而不是通过包含所有内容的整个列表并检查它的类型来决定是否做某事?非常感谢.

mar*_*ace 6

执行此操作的常规方法是在GameObject上使用接口.

public interface GameObject {
   void update();
}
Run Code Online (Sandbox Code Playgroud)

然后让每个对象实现GameObject.

public class Player implements GameObject {
   public void update() { // update player...
}

public class Wall implements GameObject {
   public void update() { // probably do nothing...
}

public class Enemy implements GameObject {
   public void update() { // update enemy...
}
Run Code Online (Sandbox Code Playgroud)

然后你的更新循环看起来像这样.

public void update() {
    for(GameObject o : objects) {
       o.update();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不能保证你这更快,但它可能是.编译器可能会像这样优化虚拟调用(虚拟调用在面向对象编程中很常见,因此编译器知道如何优化是一件非常好的事情),而我认为它不会能够几乎也优化了对实例类类型的显式检查.