一尘不染

如何实现最近使用的缓存

algorithm

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

这里是要求和限制…

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

阅读 272

收藏
2020-07-28

共1个答案

一尘不染

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

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

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

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

private static final int MAX_ENTRIES = 100;

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

还有一个构造函数,可让您指定是要类通过插入还是使用来按顺序存储事物,因此,您的驱逐策略也有一点灵活性:

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

对于使用顺序,传递 true ;对于插入顺序,传递 false

2020-07-28