我刚刚看到这个answer in SO,其中提到Google-collections MapMaker很棒。我查看了文档,但无法弄清楚我可以在哪里使用它。可以有人指出一些使用MapMaker的场景。
答案 0 :(得分:12)
以下是我使用MapMaker
的一种方式的快速示例:
private final ConcurrentMap<Long, Foo> fooCache = new MapMaker()
.softValues()
.makeComputingMap(new Function<Long, Foo>() {
public Foo apply(Long id) {
return getFooFromServer(id);
}
});
public Foo getFoo(Long id) {
return fooCache.get(id);
}
在地图上调用get(id)
时,它会返回该ID的地图中的Foo
,或者它将从服务器检索它,将其缓存并返回。一旦它成立,我就不必考虑它了。另外,由于我设置了softValues()
,因此缓存无法填满并导致内存问题,因为系统能够根据内存需求清除缓存中的条目。但是,如果从地图中清除了缓存的值,它可以在下次需要时再次询问服务器!
问题是,这只是一种可以使用的方式。让地图使用强,弱或软键和/或值的选项,以及在特定时间后删除条目的选项,可以让你用它做很多事情。
答案 1 :(得分:3)
如果您查看SoftReference
和WeakReference
的说明,可能会有所帮助。
SoftReference
对于在缓存中使用非常有用,因为它们将在内存不足时被明确清除。
WeakReference
告诉垃圾收集器它可以收集引用它的对象,只要在其他地方没有强引用它。这通常用于可以根据需要快速查找的内容。
因此,考虑使用MapMaker为缓存创建一个带有softValues的ConcurrentMap,并为临时查找表创建一个带有weakKeys的ConcurrentMap。
编辑:softValues使用LRU策略。