java - Java7 WeakHashMap isEmpty() 似乎是错误的
问题描述
我正在尝试使用 Java7 的 WeakHashMap,但我发现它的 isEmpty() 方法给了我错误的结果。
import java.util.Map;
import java.util.WeakHashMap;
public class Test
{
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();
System.out.println(map.isEmpty());
System.out.println(map.keySet().isEmpty());
System.out.println(map);
}
}
实际结果:
错误的
真的
{}
也就是说,
map.isEmpty() 和 map.keySet().isEmpty() 不一致。有人可以帮我理解吗?非常感谢。
解决方案
您应该阅读以下的 javadoc WeakHashMap
:
类的行为
WeakHashMap
部分取决于垃圾收集器的行为,因此一些熟悉的(尽管不是必需的)Map
不变量不适用于此类。因为垃圾收集器可能随时丢弃键,aWeakHashMap
可能表现得好像一个未知线程正在默默地删除条目。特别是,即使您在一个WeakHashMap
实例上同步并且不调用它的任何 mutator 方法,该方法也有可能size
随着时间的推移返回较小的值,该isEmpty
方法返回false
,然后true
,该containsKey
方法返回true
,稍后返回false
给定的键, 用于get
为给定键返回值但稍后返回null
的方法put
返回方法null
和remove
返回false
以前出现在映射中的键的方法,以及对键集、值集合和条目集的连续检查以产生连续较少数量的元素。
总而言之,您所看到的效果是完全有效的。
推荐阅读
- python - python - 如何在python中使用不同符号分割另一个文本之后获取文本?
- java - 如何从java中的数组中获取具有固定字符串的对象?
- javascript - 在 JS 中使用 Fetch API 检索远程 .csv 文件
- python - 将多个值从元组发送到函数
- python-3.x - 以顺序方式提交snakemake作业
- c# - WPF 将 ComboBox ItemSouce 绑定到 ObservableCollection 并将 SelectedItem 绑定到 DataContext 模型属性
- c# - 通过模型的属性更改 TreeViewItem 颜色
- c# - 将 JsonConvertorFactory 添加到 Blazor Web 程序集应用程序
- angular - 如何在下拉选项加载完成后确保下拉模型加载而不破坏角度 9 中代码的异步性质
- spring - javax.naming.NameNotFoundException:名称 [jdbc/jndiDS] 未绑定在此上下文中。找不到 [jdbc]