我想在我的应用程序中使用两个hashmap进行更简单的池验证 - 一个带有活动对象,一个带有死亡。
我有一个函数可以生成活动对象并将它们放在一个hashmap中,如果它们死掉,它会将它从hashmap中删除。这导致对垃圾收集器的大量调用以及仅增长的大型ram使用。相反,我想到了解决方案,创建了两个类似的hashmap:
ConcurrentHashMap<Point, Mob> spawned = new ConcurrentHashMap<Point, Mob>();
ConcurrentHashMap<Point, Mob> died = new ConcurrentHashMap<Point, Mob>();
将死对象放在死亡的hashmap中,例如:
MobSpawnedEntries1 = spawned.entrySet().iterator();
while (MobSpawnedEntries1.hasNext()) {
Map.Entry<Point, Mob> entry = MobSpawnedEntries1.next();
if(entry.getValue().isDead()){
died.put(entry.getKey(), entry.getValue());
MobSpawnedEntries1.remove();
}
}
之后在spawn函数中,我检查了“死”的hashmap是否为空,如果不是我刚刚重新生成了对象并将其放置在生成的hashmap中,并且还将其从死亡的hashmap中删除。
if (diedEntries.hasNext()) {
Map.Entry<Point, Mob> entry = diedEntries.next();
Point p=entry.getKey();
Mob b=entry.getValue();
b.Reset();
p.x=...;
p.y=...;
spawned.put(p,b);
diedEntries.remove();
}
这导致奇怪的错误,例如所有实体变得相同,并且更改为最新产生的实体,当一个权利死亡时它们都会死亡,以及类似的东西 - 就像所有实体之间存在连接一样。我认为这是关键所以我只是为每个实体创建了一个新的Point,而不是放置旧密钥,但bug仍然存在。为什么?什么是更好的解决方案(如果需要在游泳池中使用,如果有人可以告诉我如何 - 我从未使用过游泳池或者不知道如何使用它),那就很高兴。