WeakHashMap作为缓存没有用,至少大多数人认为它的方式是这样。正如你所说,它使用弱键,而不是弱值,所以它不是为大多数人想要使用它而设计的(事实上,我看到人们错误地使用它)。
WeakHashMap主要用于保存有关您无法控制其生命周期的对象的元数据。例如,如果您有一堆对象通过您的类,并且您希望跟踪有关它们的额外数据,而无需在它们超出范围时收到通知,并且不需要引用它们来保持它们处于活动状态。
一个简单的例子(也是我以前用过的一个)可能是这样的:
WeakHashMap<Thread, SomeMetaData>
您可以跟踪系统中各种线程正在执行的操作;当线程死亡时,该条目将从映射中以静默方式删除,并且如果您是对 Thread 的最后一个引用,则不会阻止该线程被垃圾回收。然后,您可以循环访问该映射中的条目,以找出有关系统中活动线程的元数据。
有关详细信息,请参阅 WeakHashMap in not a cache!
对于您所追求的缓存类型,请使用专用缓存系统(例如EHCache)或查看Guava的MapMaker类;类似的东西
new MapMaker().weakValues().makeMap();
会做你所追求的,或者如果你想变得花哨,你可以添加定时到期:
new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();