Java ArrayList 效率

标签 java performance arraylist

我正在编写一个游戏,并且有一个名为 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

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

最佳答案

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

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();
    }
}

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

关于Java ArrayList 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577193/

相关文章:

java - Java 是如何加载原生 NSImage 的?

java - 在维护期间如何向网络应用程序用户显示 "temporarily out of service"页面?

java - 无法打印 ArrayList

java - 简单的java问题: object declaration

java - 如何在 docx4j 中的 addParagraphOfText 上设置空格?

performance - OpenCL 如何分配工作项?

sql - 大表的自定义排序和分页

java - 哈希集。在大集合中表现缓慢

android - Android中有类似NSDictionary的东西吗?

Java:方法接受一个字符串并构造一个程序,使用 for 循环输出相同的字符串