0

如果我创建类型的对象和类型的lion对象prey,我想做:

lion.eat(prey)

在。。。期间

lion.energy=energy+10,as an example.
prey=null

但我也想从逻辑生态系统中彻底摧毁猎物。

我知道垃圾收集器和所有这些,而且你们所说的关于垃圾收集器的所有事情都会在没有任何东西指向它时立即销毁该对象。

但我正在一个虚拟生态系统中实现一个包含数百万狮子和鹿实例的遗传算法。现在如何消除死去的动物?

请不要开玩笑,我厌倦了总是在垃圾收集器和对象谋杀的相同答案上绊倒,我想要一个解决方案的描述,以在逻辑上从狮子方法中取消引用猎物对象。

public class prey
{
  int energy=10;
}

public class lion
{
  int energy=0;

  public void eat(prey aDeer)
  {
    this.energy=aDeer.energy+this.energy; ///acumulate energy values from prey
    aDeer=null;//destroys the object from ecosystem, which seems impossible to do in java
  }
}
4

3 回答 3

1

您已经拥有数百万的猎物,并且可能将它们存储在一个集合中;例如,一个ArrayList. 从ArrayList;中删除一个项目非常简单。调用它的.remove()函数。

于 2012-08-27T23:36:11.927 回答
0

正如已经提到的,您不能在 Java 中执行显式内存管理。您所能做的就是确保没有引用使死对象保持活动状态(双关语!)并让垃圾收集器完成其工作。请注意,这可能比显式内存管理更有效,特别是在大量小对象被破坏的情况下。

如果您的人口总体规模的变化比其成员出生和死亡的速度慢得多,那么您可能确实,正如@veer 建议的那样,考虑保留一个动物池,而不是创建新对象,当它们从池中提取它们时出生并在他们死后返回那里。

于 2012-08-28T10:53:30.437 回答
0

如果对象的创建和销毁是瓶颈(通过分析而不是猜测来查找),您可以将所有动物放入数组(或数组列表以允许增长,如果最大人口未知),在每个动物中存储其当前索引,以及何时杀死动物,将其与最后一个活着的动物交换并减少活体动物的计数器。简而言之,按照前面的建议制作动物池。如果只有少数动物留给下一代,请考虑 2 个阵列,只需遍历前一个并处理生活到新一代并切换这些阵列。

但是为了使它有用,你需要让所有动物(在给定的数组中)在结构上是相同的,所以曾经的鹿可以成为下一次的兔子。所以要么只有动物类,要么每个物种一个数组。

PS。不要试图找到手动销毁对象的方法,要么找到避免创建和销毁对象的方法(特别是如果生成大小没有太大变化,那么每个人都将再次被需要)或依赖 GC。

于 2012-08-28T12:00:50.323 回答