2009-11-06 42 views
2

是否有任何靜態大小哈希表的實現將條目限制爲最新或最常用的元數據?我不想自己跟蹤這些信息。我知道大多數緩存組件都會跟蹤這一點,但我寧願不會引入很多新的依賴關係。經常使用的元數據哈希表

回答

10

可以使用使用LinkedHashMap標準JDK庫構建LRU緩存:

public class MyLRUCache<K, V> extends LinkedHashMap<K, V> { 

    private final int maxEntries; 

    public MyLRUCache(int maxEntries) { 
     // you can be a bit fancy with capacity and load factor 
     super(16, 0.75, true); 
     this.maxEntries = maxEntries; 
    } 

    @Override 
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { 
     return size() > maxEntries; 
    } 
} 

您可能希望與WeakReference S以及玩。

+1

我喜歡這樣。我以前沒有聽說過。 – monksy 2009-11-06 17:47:43

+0

希望我在之前瞭解WeakReferences。這會讓這個緩存機制在我工作時更加棒。 – monksy 2011-10-19 18:14:07

2

使用LinkedHashMap和覆蓋removeEldestEntry,並確保使用 constructor,允許accessOrder as true

Accessordered使得地圖中刪除最近最少訪問的項目,而不是大。

所有查詢都會改變地圖的結構,因此會慢一點。

實施例:

public AccesOrderedLRUCache<V,K> extends LinkedHashMap<V,K>{ 
    private final m_capacity; 

    public AccesOrderedLRUCache(int capacity) { 
     super(0.75*capacity, 0.75, true); 
     m_capacity = capacity; 
    } 

    @Override 
    protected boolean removeEldestEntry (Map.Entry<K,V> eldest) { 
     return size() > getCapacity(); 
    } 

    public int getCapacity() { 
     return m_capacity; 
    } 
} 
+0

不在jdk 1.6.0_13中。 http://kickjava.com/src/java/util/LinkedHashMap.java.htm(不知道是哪個版本,但仍然沒有) – Fedearne 2009-11-06 19:01:40

+0

@Fedearne,謝謝。我混淆了訪問按訂單排序 – notnoop 2009-11-06 19:09:02

+0

0.75 *容量可能不是你在這裏的意思。假設你實際上意味着容量/ 0.75? 另外getCapacity缺少一個parens,我寧願在removeEldestEntry()中將m_capacity改爲LRUCache.this.cacheSize。 – 2009-11-09 19:05:32