如果我创建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
}
}发布于 2012-08-28 07:36:12
从ArrayList中删除一个项非常简单;调用它的.remove()函数。
发布于 2012-08-28 18:53:30
正如前面已经提到的,您不能在Java中执行显式内存管理;您所能做的就是确保没有任何引用会使已死的对象保持活动状态(双关语!)让垃圾收集器来做它的工作。请注意,这可能比显式内存管理更有效,特别是在大量小对象被销毁的情况下。
如果你的种群总体规模的变化比它的成员出生和死亡的速度慢得多,你可能真的会考虑保留一个动物池,而不是创建一个新的对象,在它们出生时从你的池中提取它们,并在它们死亡时将它们放回那里。
发布于 2012-08-28 20:00:50
如果对象创建和销毁是瓶颈(通过分析而不是猜测来发现),您可以将所有动物放入数组(或数组列表,以便在最大种群未知的情况下允许增长),在每个动物中存储其当前索引,并在杀死动物时,将其与最后一个活动物交换,并减少活动物的计数器。用更少的话说,像之前建议的那样创建一个动物池。如果只有很少的动物被保存到下一代,考虑2个数组,只需遍历上一代,并处理到新一代,并切换这些数组。
但是为了使它有用,你需要让所有的动物(在给定的数组中)在结构上是相同的,这样以前是鹿的东西就可以成为下一次的兔子。所以要么只有Animal类,要么每个物种有一个数组。
PS。不要试图找到手动销毁对象的方法,也不要想办法避免创建和销毁对象(特别是。如果代的大小变化不大,那么每个人都将再次被需要)或依赖GC。
https://stackoverflow.com/questions/12150919
复制相似问题