我有一个游戏对象的 HashMap。每个 Game 对象都包含一个玩家的 HashMap 和一个移动列表。游戏结束后,我想将其从地图中删除。我应该在删除游戏对象之前清空玩家地图和移动列表还是 GC 会处理它?
是的,这是一个新手问题,对此感到抱歉;)
我有一个游戏对象的 HashMap。每个 Game 对象都包含一个玩家的 HashMap 和一个移动列表。游戏结束后,我想将其从地图中删除。我应该在删除游戏对象之前清空玩家地图和移动列表还是 GC 会处理它?
是的,这是一个新手问题,对此感到抱歉;)
你不需要做任何事情。
只要整个对象图没有被任何根对象引用,GC 就会自动收集整个对象。
有根对象是保证不可收集的对象 - 由静态字段或任何线程中的活动堆栈帧引用的对象。
如果您从 Game 对象中引用 Players HashMap 并且当您的游戏结束时,并且您正在将其从地图中删除,则玩家地图也将被删除,因为它是从游戏中引用的。
当对游戏的引用丢失时,所有从游戏引用的对象如果不是来自外部游戏对象的引用,也会丢失
好吧,让我们通过一个例子来理解这一点。
让我们看看这段代码
public class Room {
Door door = new Door();
public static void main(String[] args) {
Room room = new Room();
room = null;
}
}
在这里,当我们编写 时,将创建Room room = new Room()
一个对象,并且因为 a是它的实例变量,所以也创建了 a。将作为房间使用的参考。此时,我们可以直接访问,并且可以使用 room 访问它。所以对象将通过.Room
Door
door
door
room.door
room
door
door
room
现在,当我们这样做时room = null
,我们失去了对Room
对象的引用。由于Door
对象仅通过 引用Room
,我们失去了它的唯一引用。由于room = null
我们无法访问room.door
.
这被图解地称为如下
第一张图片显示了Room room = new Room();
执行时的条件。它参考了门。
第二张图表示之后的情况room = null
。请注意,虚线表示参考丢失。现在参考Room
丢失了,显然 fordoor
也丢失了。
在这个时间点......两个对象都将有资格进行垃圾收集
希望这个答案有点帮助:)