【发布时间】:2014-09-08 11:02:06
【问题描述】:
我定义了一个类来管理游戏室。当用户创建一个新房间时,我会生成一个具有唯一房间号的新房间并将其添加到哈希集中。
现在,我希望从哈希集中删除那个 Room 对象并回收 Room 对象以解决性能问题,比如 24 小时,否则废弃的 Room 对象将花费我大部分的记忆
我怎样才能做到这一点?此外,任何提高性能的建议都将受到高度赞赏。
我的班级如下:
public class RoomService {
private RoomService(){
super();
}
private HashSet<Room> roomSet =new HashSet<Room>();
private static RoomService instance =new RoomService();
public static RoomService getServiceInstance(){
return instance;
}
private static Integer generateRandom(int length) {
Random random = new Random();
char[] digits = new char[length];
digits[0] = (char) (random.nextInt(9) + '1');
for (int i = 1; i < length; i++) {
digits[i] = (char) (random.nextInt(10) + '0');
}
return Integer.decode(new String(digits));
}
/**
* Generate new Room with an unique Room number
* @return
*/
public Room newRoom(){
Room newRoom;
do{
newRoom =new Room(generateRandom(4));
}
while(!roomSet.add(newRoom));
return newRoom;
}}
public class Room {
private Integer roomNum;
private Date createTime=new Date();
private String creatorId;
/*
* constructor
*/
public Room(Integer roomNum) {
super();
this.roomNum = roomNum;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((roomNum == null) ? 0 : roomNum.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Room other = (Room) obj;
if (roomNum == null) {
if (other.roomNum != null)
return false;
} else if (!roomNum.equals(other.roomNum))
return false;
return true;
}
//getter and setter
//
//
public String getCreatorId() {
return creatorId;
}
public void setcreatorId(String creatorId) {
this.creatorId = creatorId;
}
public Integer getRoomNum() {
return roomNum;
}
public Date getCreateTime() {
return createTime;
}
}
【问题讨论】:
-
这正是您所需要的:stackoverflow.com/a/3802420/544983
-
谢谢!但是我使用的是 Set 而不是地图?他们有什么例子吗?
-
那你可以看看 guava "cachebuilder" 的例子。
-
对不起,我不太明白代码。我将该示例复制到我的代码中,并使用 Integer 作为 Key,Customer Class Room 作为 Graph。当我返回时返回 createExpensiveGraph(key);从 CacheLoader 的加载方法中,它说“方法 createExpensiveGraph(Integer) 未定义新 CacheLoader
(){} 类型的方法”我还需要做其他事情吗? -
将要回收的对象放入队列中,按回收日期排序。将计时器设置为队列中最早的日期。当计时器关闭时,将过期条目出列并执行您为“回收”它们所做的任何事情。 (当然还要重置计时器。)