Java有效地删除对象

Java有效地删除对象,java,Java,我想用java做一个小游戏。我创建了一个我称之为Game的类和一些子类。我将子类Body用于游戏中的各种对象。我想在游戏中为生成对象提供一个方法。此方法应添加对列表的引用,以便以后可以计算与其他实体的交互 游戏类的外观如下所示: import java.util.*; class Game { public List<Body> bodies = new ArrayList<Body>(); public void spawn( Body body

我想用java做一个小游戏。我创建了一个我称之为
Game
的类和一些子类。我将子类
Body
用于游戏中的各种对象。我想在
游戏
中为生成对象提供一个方法。此方法应添加对列表的引用,以便以后可以计算与其他实体的交互

游戏类的外观如下所示:

import java.util.*;

class Game {

    public List<Body> bodies = new ArrayList<Body>();

    public void spawn( Body body ) {
        bodies.add( body );
    }
}
import java.util.*;
班级游戏{
public List bodies=new ArrayList();
公共虚空繁殖(身体){
主体。添加(主体);
}
}
是的,我认为这是可行的。现在我想也能把尸体拆了。我试过这个:

import java.util.*;

class Game {

    public List<Body> bodies = new ArrayList<Body>();

    public void spawn( Body body ) {
        bodies.add( body );
    }

    public void despawn( Body body ) {
        body = null;
    }
}
import java.util.*;
班级游戏{
public List bodies=new ArrayList();
公共虚空繁殖(身体){
主体。添加(主体);
}
公共空间被剥夺(主体){
body=null;
}
}

它没有按预期工作。我猜它只是删除了对对象的引用,如果这是正确的,我将不知道如何删除对对象的所有引用。我想我可以迭代数组,但这看起来很愚蠢,因为我有一个对实际对象的引用。难道我不能摧毁它吗?更优雅的选择?

唯一的
body=null
正在做的是将
despawn
的本地
正文
引用设置为
null
。它不会影响实际对象

要将其从
body
列表中删除,请调用
body
,将
body
作为参数传递。确保您的
Body
类覆盖
对象中的
equals
方法,以便列表可以正确找到要删除的匹配项

一旦
body
不再有引用,并且
despawn
方法完成,并且对要“despawn”的对象的任何其他引用超出范围或被重新分配,则删除的对象将有资格进行垃圾收集。它将在不再有任何引用后被垃圾收集器销毁

public void despawn( Body body ) {
    body = null;
}
这里,您只是将作为参数传入的
body
的值设置为
null

你能做的就是打电话:

public void despawn( Body body ) {
    if(body != null && !bodies.isEmpty()){
        bodies.remove(body);
    }
}

这将删除内存中所有出现的
body
,假设您也处理传递到方法中的对象。

@SamuelWillems列表中仍有对该对象的引用,因此除非将其删除,否则GC将永远不会清理该对象。当然,一旦传入
body
参数,该对象也必须超出范围或被取消引用才能被GC清理。是的,谢谢,我明白了。愚蠢的我甚至不知道有一个函数是这样工作的。我习惯用钥匙,这对我来说有点奇怪。不过非常感谢!