【发布时间】:2012-02-28 07:28:39
【问题描述】:
Javadocs 说“当一个键被丢弃时,它的条目有效地从地图中删除”。
但是除非有另一个线程偶尔删除这样的Map.Entry 条目,否则值对象不会被映射强引用吗?但由于没有这样的线程在运行,只有 get 方法调用可以删除这样的条目 - 一次一个。
出于这个原因,我几乎总是使用WeakHashMap<K, WeakReference<V>>。为什么他们不将其作为默认行为 - 也将值作为弱引用?
【问题讨论】:
-
stackoverflow.com/questions/2473410/question-about-weakhashmap 几乎是一个相同的问题。但我想知道我的断言是否正确:只有当 get() 发现密钥已被 gc'ed 时才会删除条目,坦率地说,除非我将 WeakReferences 用作值,否则这似乎没有多大价值。
-
是的,它只是轮询。如果你想要不同的东西,写你自己的版本。
-
如果您需要不同的东西,请使用库——编写自己的库非常棘手。 Guava 有
MapMaker,它可以让你配置键和值引用的强度:docs.guava-libraries.googlecode.com/git-history/release/javadoc/… -
来自ibm.com/developerworks/java/library/j-jtp11225 我认为 WeakHashMap 是半生不熟的,为什么他们使用 expungeStaleEntries() 作为大多数方法的一部分来轮询队列并且没有专门的线程来阻塞读取?跨度>
-
@Ustaman Sangat
WeakHashMap投票ReferenceQueue。
标签: java collections weak-references weakhashmap