5

我读过很多人非常喜欢 Google Guava(Collections)的MapMaker,但是我看不出它有什么好的用途。

我已经阅读了 javadoc,它说它的行为类似于ConcurrentHashMap。它还说new MapMaker().weakKeys().makeMap()几乎总是可以用作WeakHashMap的替代品。

但是,阅读ConcurrentHashMapWeakHashMap的 javadocs让我想知道什么时候使用它有用?在我看来,你不能保证你在地图上放的任何东西都会在那里,还是我误解了?

4

4 回答 4

7

问题MapMaker在于,您构建的地图类型有很多选项,这使这些地图能够用于多种用途。

  • Dirk 给出了使用弱键的一个很好的例子。
  • 软值对于缓存很有用,因为您可以在映射中缓存值而不必担心内存不足,因为如果系统需要内存,系统可以自由地从缓存中逐出条目。
  • 您可以选择让条目在一定时间后过期。这对于缓存也很有用,因为您可能希望在执行昂贵的操作来更新数据之前将某些数据缓存一段特定的时间。
  • 我最喜欢的事情之一是制作计算地图。计算映射使用 aFunction<K, V>自动检索与给定键关联的值(如果它不在映射中)。这与软值和/或到期时间很好地结合在一起。在映射驱逐条目后(由于内存需求或过期),下次请求与该键关联的值时,它将再次自动检索并缓存在映射中。
于 2010-09-01T15:57:13.710 回答
6

......这就是它的重点。如果您不想(或负担不起)将对象无限期地保留在内存中,则弱引用很有用。考虑以下用例:您需要将信息与类相关联。现在,由于您在可能会重新加载类的环境中运行(例如,Tomcat 或 OSGi 环境),因此您希望垃圾收集器能够在认为安全时尽快回收类的旧版本.

实现这一点的初步尝试,可能看起来像

class ClassAssoc {
    private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}

这里的问题是:这将cache永远保留成员中的所有类(或者至少,除非它们被手动删除),迫使垃圾收集器无限期地保留它们,包括从类引用的所有内容(静态成员值,类加载器信息, ...)

通过使用弱引用,垃圾收集器可以在没有其他对旧版本的引用(通常是实例)时回收该类的旧版本。另一方面:只要存在这样的引用,就保证该值也可以从弱引用对象中访问,因此,它是缓存表中的有效键。

将并发性和其他暴行添加到图片中,您就可以MapMaker选择提供...

于 2010-09-01T12:03:21.667 回答
0

WeakHashmap有人(地图除外)引用该条目时,该条目将保留在地图中。如果除了地图之外没有其他人在条目上保留引用,则可以在下一次 GC 运行时删除该条目。

于 2010-09-01T11:58:14.917 回答
-2

ConcurrentHashMapMap可以在多线程环境中安全使用的。它比常规的同步版本更好,Map因为并发意味着不同的线程通常可以访问此映射而不会阻塞。

于 2010-09-01T12:08:34.980 回答