2 回答
TA贡献1836条经验 获得超4个赞
你应该阅读 WeakHashMap
的 javadoc:
该类的行为部分取决于垃圾回收器的操作,因此几个熟悉的(尽管不是必需的)不变量不适用于此类。由于垃圾回收器可能随时丢弃密钥,因此 a 的行为可能就像未知线程正在静默删除条目一样。特别是,即使您在实例上进行同步并且不调用其赋值函数方法,
size
方法也可能随着时间的推移返回较小的值,isEmpty
方法返回false
然后返回 true
,对于返回该方法,稍后对于给定键,对于该方法返回给定键的值,但稍后返回 , 用于返回的方法和返回以前似乎在映射中的键的方法,以及连续检查键集、值集合和条目集以生成连续较少数量的元素。WeakHashMap
Map
WeakHashMap
WeakHashMap
containsKey
true
false
get
null
put
null
remove
false
简而言之,你所看到的效果是完全有效的。
TA贡献1796条经验 获得超4个赞
WeakHashMap::isEmpty 说:
...此结果是快照,可能不会反映未处理的条目,这些条目将在下次尝试访问之前删除,因为它们不再被引用。
因此,您会期望 在 GC 之后和访问之后返回正确的值。此代码演示了以下内容:isEmpty()
public class Scratch1 {
public static void main(final String[] args) {
final Map<String, Boolean> map = new WeakHashMap<>();
String b = new String("B");
map.put(b, true);
b = null;
System.gc();
// map not internally accessed at this point
System.out.println(map.isEmpty());
// let's access the Map's internals (and hopefully coerce
// it into removing no-longer-referenced keys)
System.out.println(map.keySet()
.isEmpty());
// map HAS now been accessed
System.out.println(map.isEmpty());
}
}
收益 率:
false
true
true
添加回答
举报