相关疑难解决方法(0)

您将如何在Java中实现LRU缓存?

请不要说EHCache或OSCache等.为了这个问题的目的,假设我只想使用SDK(从实践中学习)来实现我自己的.鉴于缓存将在多线程环境中使用,您将使用哪些数据结构?我已经使用LinkedHashMapCollections#synchronizedMap实现了一个,但我很好奇任何新的并发集合是否会更好.

更新:当我发现这个金块时,我只是阅读Yegge的最新消息:

如果您需要持续时间访问并希望维护插入顺序,那么您不能比LinkedHashMap做得更好,这是一个真正精彩的数据结构.它可能更精彩的唯一方法是如果有并发版本.可惜.

在我使用上面提到的LinkedHashMap+ Collections#synchronizedMap实现之前,我的想法几乎完全相同.很高兴知道我不只是忽略了一些东西.

基于到目前为止的答案,对于高度并发的LRU来说,我最好的选择是使用一些相同的逻辑来扩展ConcurrentHashMapLinkedHashMap.

java caching lru data-structures

167
推荐指数
8
解决办法
12万
查看次数

堆与二进制搜索树(BST)

堆和BST有什么区别?

何时使用堆以及何时使用BST?

如果你想以排序的方式获取元素,BST是否优于堆?

algorithm heap binary-tree binary-search-tree

158
推荐指数
4
解决办法
9万
查看次数

使用LinkedHashMap实现LRU缓存

我试图使用LinkedHashMap实现LRU缓存.在LinkedHashMap(http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html)的文档中,它说:

请注意,如果将键重新插入地图,则插入顺序不会受到影响.

但是,当我做以下投入时

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private int size;

    public static void main(String[] args) {
        LRUCache<Integer, Integer> cache = LRUCache.newInstance(2);
        cache.put(1, 1);
        cache.put(2, 2);
        cache.put(1, 1);
        cache.put(3, 3);

        System.out.println(cache);
    }

    private LRUCache(int size) {
        super(size, 0.75f, true);
        this.size = size;
    }

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

    public static <K, V> LRUCache<K, V> newInstance(int size) {
        return new LRUCache<K, V>(size);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出是

{1=1, 3=3}
Run Code Online (Sandbox Code Playgroud)

这表明重新插入确实影响了订单.有人知道任何解释吗?

java insert linkedhashmap lru

21
推荐指数
3
解决办法
3万
查看次数

何时在java中使用hashhashmap而不是hashmap?

在linkedhashmap和hashmap中选择的实际场景是什么?我已经完成了每个工作,并得出结论:linkedhashmap维护插入顺序,即元素将以与插入顺序相同的顺序检索,而hashmap将不维护顺序.那么有人可以告诉在什么实际场景中选择其中一个集合框架以及为什么?

java types hashmap linkedhashmap data-structures

7
推荐指数
4
解决办法
2万
查看次数