【问题标题】:Java ArrayList EfficiencyJava ArrayList 效率
【发布时间】:2014-12-20 05:16:15
【问题描述】:

我正在编写一个游戏,有一个称为 GameObject 的抽象类和三个扩展它的类(Player、Wall 和 Enemy)。

我有一个这样定义的列表,其中包含我游戏中的所有对象。

List<GameObject> objects;

当我需要对一个对象做某事时,我会这样做:

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
         }
    }
}

如您所见,我必须遍历整个列表并检查类型才能找到一个对象。在我看来,这似乎不是很有效。于是我想到了将不同的派生类存储在它们自己的列表中。

private List<Wall> walls;
private List<Enemy> enemies;
private Player player; // only one

这会比遍历包含所有内容的整个列表并检查其类型来决定是否做某事更有效吗?非常感谢。

【问题讨论】:

  • 一个列表或多个列表无关紧要。您应该考虑为每个对象分配一个标识符并将其存储在Map 实现中以便于检索。
  • 我建议您将方法doSomething() 放入GameObject(可能是abstract)然后您可以直接调用o.doSomething() 并让实例决定它是什么。或者update()

标签: java performance arraylist


【解决方案1】:

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

public interface GameObject {
   void update();
}

然后让每个对象实现 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...
}

那么你的更新循环看起来像这样。

public void update() {
    for(GameObject o : objects) {
       o.update();
    }
}

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

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2010-10-28
    • 2013-04-18
    • 2013-03-13
    • 1970-01-01
    • 2023-03-27
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多