Java 使用两个hashmap重用对象
我想在我的应用程序中使用两个hashmap对池进行更简单的验证——一个是活动对象,另一个是死亡对象 我有一个生成活动对象并将其放置在hashmap中的函数,如果它们死亡,它会将其从hashmap中删除。这会导致大量对垃圾回收器的调用,并导致大量ram的使用量只会增加。相反,我想到了解决方案,创建了两个如下的hashmap:Java 使用两个hashmap重用对象,java,android,hashmap,Java,Android,Hashmap,我想在我的应用程序中使用两个hashmap对池进行更简单的验证——一个是活动对象,另一个是死亡对象 我有一个生成活动对象并将其放置在hashmap中的函数,如果它们死亡,它会将其从hashmap中删除。这会导致大量对垃圾回收器的调用,并导致大量ram的使用量只会增加。相反,我想到了解决方案,创建了两个如下的hashmap: ConcurrentHashMap<Point, Mob> spawned = new ConcurrentHashMap<Point, Mob&
ConcurrentHashMap<Point, Mob> spawned = new ConcurrentHashMap<Point, Mob>();
ConcurrentHashMap<Point, Mob> died = new ConcurrentHashMap<Point, Mob>();
生成的ConcurrentHashMap=新ConcurrentHashMap();
ConcurrentHashMap=新的ConcurrentHashMap();
将一个死对象放在死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();
}
}
mobsawnedEntries1=spawned.entrySet().iterator();
while(mobpowneddentries1.hasNext()){
Map.Entry=mobsawnedEntries1.next();
if(entry.getValue().isDead()){
died.put(entry.getKey(),entry.getValue());
mobsawnedEntries1.remove();
}
}
在此之后,在spawn函数中,我检查了“dead”hashmap是否为空,如果不是,我只是重新启用了对象并将其放置在派生的hashmap中,还将其从dead 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();
}
if(diedEntries.hasNext()){
Map.Entry=diedEntries.next();
p点=entry.getKey();
Mob b=entry.getValue();
b、 重置();
p、 x=。。。;
p、 y=。。。;
产卵。放置(p,b);
Diedertries.remove();
}
问题是:
这导致了一些奇怪的错误,比如所有的实体都变得相同,变成了最新生成的实体,当一个实体死了,它们也都死了,诸如此类的东西——就像所有实体之间都有连接一样。我认为这是关键,所以我只是为每个实体创建了一个新的点,而不是放置旧的关键,但错误仍然存在。为什么?有什么更好的解决方案(如果需要在池中使用,如果有人能告诉我如何使用,我会很高兴的-我从来没有使用过池或知道如何使用它)。请发布有效代码,例如
if(entry.isDead()){
无效,因为entry
是一个映射。entry
@AndyTurner抱歉,已修复。@AndyTurner Point是一个普通点..而Mob是我用许多功能和位图创建的一个类。如果没有访问Point
和Mob
的实现,很难提供帮助,但我想:可能是你(没有)实现equals()
和hashCode()
在这两个类中?也许你有一些静态字段,它们不应该是静态的?你需要在地图中保留死值吗?你是否将点的坐标设置为相同的值,例如0,0
?这意味着你在死图中只保留了一个东西,因为你是始终使用相同的键添加值。某种类型的队列
可能是另一种选择。