用Java实现IDManager - 高效的方法

时间:2015-02-21 13:57:40

标签: java

IDManager API提供了2种方法

  1. get_ID() - 每次调用时都会生成一个唯一的id并返回它,
  2. free_ID(id) - 释放传入的id和释放的id应该可以在以后重用。
  3. 你能帮我解决一下如何有效地解决这个问题吗? - 作为最好的DS使用,什么是存储和维护ID的最佳方式?

    谢谢!

1 个答案:

答案 0 :(得分:1)

将已使用的ID存储在HashSet中,并将最后生成的ID保存在单独的变量中。

当有人致电get_ID时,请递增上次生成的ID并验证其不在HashSet中。继续这样做,直到找到不在HashSet中的ID。当您在HashSet中找到一个不在其中的人时,请添加该值并返回该值。

当有人拨打free_ID(id)时,只需将其从HashSet删除即可。

对于get_ID的前21亿次通话,ID值将继续递增,每次通话都会给出唯一的ID。然后,整数将滚动并开始重新使用ID。此时,检查HashMap中是否会出现的代码将会启动,而get_ID方法将开始花费更长时间,因为它会继续检查值以查找未使用的值

如果这成为ID值数十亿请求的问题,那么您可以创建一个Queue来保存已使用和释放的ID。一旦ID值达到最大值,您就可以开始从队列的前面分配值,而不是递增计数器和搜索。我只会添加这部分,但是,如果有必要,因为它需要8 GB的RAM来保存整个列表。

另一种可能性是您希望您的ID永远是最低的值。如果是这种情况,那么您应该使用上面描述的Queue,但在递增并生成新ID之前让get_ID检查队列。这样,如果有任何已释放的ID号,则在创建新的更高值之前使用它们。此队列只会与您不再使用的ID一样大,因此它会扩展到您的要求大小。