java - LinkedHashMap(或类似的东西)可以使用自定义排序吗?

标签 java caching

通过这个问题,我的意思是:我有一个使用 LinkedHashMap 的 Java 缓存实现。来实现缓存。然而,我开始意识到,在维护缓存时,除了最近最少使用或上次插入之外,我还需要一个排序。但我真的很喜欢 LinkedHashMap 用于实现缓存的其他功能,例如大小限制的映射和可定制的 removeEldestEntry方法。由于这是可能包含数万个对象的缓存,因此我不确定 TreeMap速度足够快,可以构建(但我还没有测试过)。

我的最后一个限制是:请记住,这是在包含数十万行代码的现有代码库中,并且距离开发周期很远。因此,我们不能根据需要更换新的 COTS/OTS,因为需要进行大量的回归测试和返工。我们当前使用的是 Java 7,Guava Release 09 (哎哟!我知道...)和Apache Commons Collections 3.2.1

最佳答案

不幸的是,没有简单的方法可以做到这一点。如果您查看LinkedHashMap的源代码,您会发现该机制非常简单:任何时候访问一个项目时,它都会被移动到(私有(private))链表的末尾。位于头部的项目就是最近最少访问的项目。它很高效,但不是特别复杂。

一种选择是扩展该类以覆盖选择要删除的项目的机制。您可以通过重写 addEntry 来执行更复杂的操作,例如删除您知道不会再次访问的一个或多个项目。

类似这样的事情是可能的:

class MyHashMap extends LinkedHashMap<String, String> {
    LinkedList<String> lowPriorityItems = new LinkedList<>();

    @Override
    void addEntry(int hash, String key, String value, int bucketIndex) {
        if (isLowValue(key)) {
            lowPriorityItems.add(key);
        }
        if (size >= threshold) {
            if (lowPriorityItems.isEmpty()) {
                super.addEntry(hash, key, value, bucketIndex);
            else {
                removeAll(lowPriorityItems);
                lowPriorityItems.clear();
                super.createEntry(hash, key, value, bucketIndex);
            }
        }
    }
}

这只是一个示例,但它基本上可以通过在接近阈值时定期删除缓存中的项目来工作。如果缓存中没有低优先级项目,则会回退到使用默认方法。

希望您能够了解如何使其更加复杂以满足您的需求。

关于java - LinkedHashMap(或类似的东西)可以使用自定义排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28308821/

相关文章:

javascript - 如何在html中以编程方式清除缓存?

ipad - 增加 iPad 10MB 缓存限制

缓存的 Apache proxypass IP 地址

java - Spring 在属性中包含相对路径

java - 我可以在不嵌套 try 语句的情况下尝试多项操作吗?

java - 如何使用hibernate从多个表查询中获取数据?

caching - 清除 ccache 或使用多个 ccache 目录的原因

java - 使用JAVA从Oracle数据库读取网络文件

JavaFX - 使 TableView 高度适应行数

caching - 元标记无缓存是否会阻止路由器缓存?