簡體   English   中英

用Java高效實現IDManager

[英]Implementing an IDManager in Java - efficient way

IDManager API提供2種方法

  1. get_ID()-每次調用時都會生成一個唯一的ID並將其返回,
  2. free_ID(id)-釋放傳入的ID,釋放的ID以后可以重用。

您能幫我有效地解決這個問題嗎? -與在最佳DS中使用一樣,存儲和維護ID的最佳方法是什么?

謝謝!

將使用的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 ,但是讓get_ID在增加並生成新ID之前檢查隊列。 這樣,如果有任何空閑的ID號,則會在創建新的更高值之前使用它們。 該隊列將僅與您不再使用的ID一樣大,因此它將根據您的需求大小進行擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM