有限大小的哈希映射

Pha*_*ate 7 java

我想将哈希映射用作缓存.缓存有一个初始大小,如果你尝试插入一个项目,当缓存已满时,最近使用的项目应该被替换...任何想法?

Pet*_*rey 17

您可以通过实现removeEldest来使用LinkedHashMap

public static <K,V> Map<K,V> lruCache(final int maxSize) {
    return new LinkedHashMap<K,V>(maxSize*4/3, 0.75f, true) {
        @Override
        protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
            return size() > maxSize;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

更多细节

http://vanillajava.blogspot.co.uk/2011/06/java-secret-lru-cache-in-java.html

http://blog.meschberger.ch/2008/10/linkedhashmaps-hidden-features.html


Bri*_*new 8

你看过番石榴了吗?它具有基于工厂的方法,用于创建具有缓存等的集合.

例如(来自链接的文章)

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .maximumSize(1000)
   .expireAfterWrite(10, TimeUnit.MINUTES)
   .removalListener(MY_LISTENER)
   .build(
       new CacheLoader<Key, Graph>() {
         public Graph load(Key key) throws AnyException {
           return createExpensiveGraph(key);
         }
       });
Run Code Online (Sandbox Code Playgroud)

  • Guava是一个很酷的库,但LinkedHashMap碰巧完全符合要求. (2认同)

Tob*_*zau 2

在 Android 上,您可以使用http://developer.android.com/reference/android/util/LruCache.html。我非常确定您可以从 AOSP 获取该实现并在 Apache 许可证下使用它。