Java的WeakHashMap通常被认为对缓存有用。尽管其弱引用是根据 map 的键而不是其值定义的,但这似乎很奇怪。我的意思是,这是我要缓存的值,而一旦缓存中没有其他人强烈引用它们,我想收集垃圾值,不是吗?
以哪种方式保留对键的弱引用?如果您执行ExpensiveObject o = weakHashMap.get("some_key")
,那么我希望缓存一直保持到'o',直到调用者不再拥有强引用,而且我也不在乎字符串对象“some_key”。
我想念什么吗?
最佳答案
WeakHashMap不能用作缓存,至少在大多数人看来是这样。如您所说,它使用的是弱键,而不是弱的值,因此它并不是针对大多数人想要使用的功能而设计的(事实上,我见过人们不正确地使用它)。
WeakHashMap最有用的是保留有关您无法控制其生命周期的对象的元数据。例如,如果您有一堆通过类的对象,并且您希望跟踪有关它们的额外数据,而无需在它们超出范围时得到通知,并且无需引用它们就可以使它们保持 Activity 状态。
一个简单的示例(以及我之前使用过的示例)可能类似于:
WeakHashMap<Thread, SomeMetaData>
您可以在哪里跟踪系统中的各个线程在做什么;当线程死亡时,该条目将从您的映射中静默删除,并且如果您是对该线程的最后引用,则不会阻止该线程被垃圾回收。然后,您可以遍历该映射中的条目,以查找有关系统中 Activity 线程的元数据。
有关更多信息,请参见WeakHashMap in not a cache!。
对于您要使用的缓存类型,请使用专用的缓存系统(例如EHCache)或查看Guava的MapMaker class;就像是
new MapMaker().weakValues().makeMap();
将执行您想要的操作,或者如果您想花哨的话,可以添加定时到期时间:
new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();
关于java - Java WeakHashMap和ojit_pre缓存ww不是值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1802809/