2012-07-26 45 views
1

LinkedHashMap看起來很棒,可以實現LRU Cache。它在鏈表管理方面有一些開銷,而不是線程安全的,但是它簡化了實現,我可以在我的代碼中處理這些。LinkedHashMap removeEldestEntry:刪除了多少個元素?

這個問題我有,我不覺得到目前爲止,有關的回答是有多少元素的LinkedHashMap從列表中刪除,如果removeEldestEntry實施,並把查找表滿。

它是否不再只是一個元素?或總大小的一定百分比。我擔心的是,如果它只消除了一個元素來放置新元素,那麼它就是一個真正的性能問題。正如我所看到的,重組操作非常昂貴。

請有人建議它是如何工作的,如果我可以管理這些被刪除的元素使用參數:initialCapacity,LoadFactor或任何其他方式計算。

回答

3

LinkedHashMap很好地實現了最瑣碎的緩存,但對於更高級的要求它可能並不理想。

返回從removeEldestEntrytrue將導致單,最舊的條目被刪除,有沒有辦法來調整這多個元素。

也許類似於GuavaCacheBuildermight be what you're looking for

2

的LinkedHashMap看起來輝煌實現LRU緩存。它在鏈表管理方面有一些開銷

所有LRU緩存都是如此。

,而不是線程安全的

您可以使用Collections.synchronizedMap()

我的問題,我沒有找到答案,到目前爲止大約是多少元的LinkedHashMap如果removeEldestEntry被實現並且放置完整列表,則從列表中移除。

刪除最長的條目。即一個也是唯一一個。

爲從源頭LinkedHashMap的

if (removeEldestEntry(eldest)) { 
     removeEntryForKey(eldest.key); 

我擔心的是,如果它只是刪除一個元素提出了新的元素,然後其真正的性能問題。

不是。

正如我所看到的翻版操作是非常昂貴的。

只有當容量增加時纔會出現重新散列,而不是在刪除條目時。

+0

感謝Jeff,Peter的回覆,然後我不使用removeEldestEntry,而是在元素的年齡保持在緩存元素中,並且每當我的覆蓋發現緩存已滿時,它將刪除最老的元素的20%。此外,我不讓get方法返回已經過期的緩存中的任何元素。 – Ravindra 2012-07-27 10:30:33

+0

爲什麼不移除任何已過期的元素,以及移除任何已過期的元素。如果您刪除20%,則可以刪除尚未過期的元素。 – 2012-07-27 10:47:33

+0

是的,我可以用這種方式去除未過期的元素。至於刪除1 exprired元素,我的get方法做​​到了這一點,並返回null給調用者。 – Ravindra 2012-07-27 10:56:36