首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java的WeakHashMap和缓存:为什么它引用的是键,而不是值?

Java的WeakHashMap和缓存:为什么它引用的是键,而不是值?
EN

Stack Overflow用户
提问于 2009-11-26 18:16:51
回答 3查看 27.6K关注 0票数 70

Java的WeakHashMap经常被认为对缓存很有用。虽然它的弱引用是根据map的键定义的,而不是它的值,但这似乎很奇怪。我的意思是,这是我想要缓存的值,当除了缓存之外没有其他人强烈引用它们时,我希望对它们进行垃圾回收,不是吗?

持有对键的弱引用在哪方面有帮助?如果你做一个ExpensiveObject o = weakHashMap.get("some_key"),那么我希望缓存保持'o‘,直到调用者不再持有强引用,而我一点也不关心string对象"some_key“。

我是不是遗漏了什么?

EN

Stack Overflow用户

回答已采纳

发布于 2009-11-26 18:32:29

WeakHashMap作为缓存并不有用,至少在大多数人看来是这样。正如您所说,它使用弱键,而不是弱值,所以它不是为大多数人想要使用它的目的而设计的(事实上,我见过人们错误地使用它)。

WeakHashMap主要用于保存有关您不能控制其生命周期的对象的元数据。例如,如果有一堆对象在类中传递,并且希望跟踪有关这些对象的额外数据,而不需要在它们超出作用域时得到通知,并且不需要对它们的引用使它们保持活动状态。

一个简单的例子(也是我以前用过的例子)可能是这样的:

代码语言:javascript
运行
复制
WeakHashMap<Thread, SomeMetaData>

在这里,您可以跟踪系统中的各个线程在做什么;当线程死亡时,条目将从映射中悄悄删除,并且如果您是对线程的最后一个引用,则不会阻止线程被垃圾回收。然后,您可以遍历该映射中的条目,以找出您拥有的有关系统中活动线程的元数据。

有关详细信息,请参阅WeakHashMap in not a cache!

对于您想要的缓存类型,可以使用专用的缓存系统(例如EHCache),也可以查看GuavaMapMaker class;类似于

代码语言:javascript
运行
复制
new MapMaker().weakValues().makeMap();

将会做你想做的事情,或者如果你想变得花哨,你可以添加timed expiration:

代码语言:javascript
运行
复制
new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();
票数 123
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1802809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档