使用谷歌收藏MapMaker?

时间:2010-09-17 16:24:12

标签: java map guava

我刚刚看到这个answer in SO,其中提到Google-collections MapMaker很棒。我查看了文档,但无法弄清楚我可以在哪里使用它。可以有人指出一些使用MapMaker的场景。

2 个答案:

答案 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)

如果您查看SoftReferenceWeakReference的说明,可能会有所帮助。

SoftReference对于在缓存中使用非常有用,因为它们将在内存不足时被明确清除。

WeakReference告诉垃圾收集器它可以收集引用它的对象,只要在其他地方没有强引用它。这通常用于可以根据需要快速查找的内容。

因此,考虑使用MapMaker为缓存创建一个带有softValues的ConcurrentMap,并为临时查找表创建一个带有weakKeys的ConcurrentMap。

编辑:softValues使用LRU策略。