java - 如何实现最近使用的缓存

标签 java algorithm caching java-me mru

实现最近使用的对象缓存的最佳方法是什么?

这是要求和限制...

  • 对象存储为键/值对象/对象对,因此接口(interface)有点像 Hashtable get/put
  • 调用“get”会将该对象标记为最近使用过的对象。
  • 可以随时从缓存中清除最近最少使用的对象。
  • 查找和清除必须很快(就像在 Hashtable 中一样快)
  • 对象的数量可能很大,因此列表查找不够好。
  • 实现必须使用 JavaME 进行,因此使用第三方代码或标准 Java 库中简洁的库类的范围很小。因此,我更多地寻找算法答案而不是现成解决方案的建议。

最佳答案

Java 集合提供 LinkedHashMap开箱即用,非常适合构建缓存。您可能在 Java ME 中没有这个,但您可以在此处获取源代码:

http://kickjava.com/src/java/util/LinkedHashMap.java.htm

如果您不能只是复制粘贴它,查看它应该可以让您开始实现一个以包含在您的移动应用程序中。基本思想只是通过 map 元素包含一个链表。如果您在有人放置或获取时保持更新,您可以有效地跟踪访问顺序和使用顺序。

文档包含通过覆盖 removeEldestEntry(Map.Entry) 构建 MRU 缓存的说明方法。您真正需要做的就是创建一个扩展 LinkedHashMap 的类并覆盖该方法,如下所示:

private static final int MAX_ENTRIES = 100;

protected boolean removeEldestEntry(Map.Entry eldest) {
   return size() > MAX_ENTRIES;
}

还有一个 constructor这使您可以指定是希望类按插入顺序还是按使用顺序存储内容,因此您的驱逐策略也有一点灵 active :

public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder)

为使用顺序传递 true,为插入顺序传递 false

关于java - 如何实现最近使用的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583852/

相关文章:

java - 是否有一种跨平台的方式来访问 JSP servlet?

java - 重新审视 Jon Skeet 在他的文章中发布的 Java 中的按值传递语义

algorithm - 渐近。如果 f(n) = theta(g(n)) 且 g(n) = theta(h(n)),那么为什么 h(n) = theta(f(n))

c# - Redis - 哪种数据类型是存储数据的最有效方式

java - JAX-RS如何处理错误的内容类型

java - 在java中使用LinkedList,当同时需要List和DeQueue方法时

javascript - 如何在 Typescript 中按名称调用具有不同签名的方法?

algorithm - 在给定区间内对整数进行排序

java - Spring Boot缓存中的咖啡因缓存: Get all cached keys

python - Django 多个缓存 - 如何选择 session 进入哪个缓存?