java - 当从 hashmap.values() 初始化的列表中删除一个项目时会发生什么?
问题描述
我在 A 类中有以下声明:
Map<String, MyClass> myMap = Collections.synchronizedMap(new LinkedHashMap<String, MyClass>());
A类也有这个功能:
public List<MyClass> getMapValuesAsList() {
return new ArrayList<>(myMap.values());
}
在 B 类中,我有一个List
这样的初始化:
List<MyClass> myList = cart.getMapValuesAsList();
我假设是myList
保留对myMap
. 当我在 中的项目中调用 setter 函数时myList
,相关值也会在 中更新myMap
,支持我的假设。但是,每当我从中删除一个项目时myList
,都会myMap
继续将MyClass
实例保留在其中。这个被移除的实例可能不是垃圾收集的,因为myMap
仍然有对它的引用。我对吗?
当在其他地方删除值时,是否有任何自动方法从地图中删除键值对?
更新:B 类传递myList
给 Android 适配器。因此,我需要某种get
功能。收藏没有这样的方法。有什么建议吗?
解决方案
YourList
包含对作为 your 值的实例的引用,因此改变mutates 的值Map
的各个元素的状态。List
Map
另一方面, yourList
不受 . 的支持Map
,因此删除其中的元素不会影响Map
.
当在其他地方删除值时,是否有任何自动方法从地图中删除键值对?
是的,如果你直接从Collection
by 返回的元素中移除一个元素myMap.values()
,它也会从Map
.
这是 Javadoc 中的状态values()
:
集合 java.util.Map.values()
返回此映射中包含的值的集合视图。集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从 map 中移除相应的映射。它不支持 add 或 addAll 操作。
推荐阅读
- java - Survival full,Tenured generation GC运行吗?
- excel - 如何使用 excel 从众多可能的选项中生成句子?
- java - 声纳扫描仪错误:IOException:参数不正确
- android - 按下返回时状态和应用栏之间的间隙
- selenium - 在 profile.setPreference("browser.popups.showPopupBlocker", false) 中获取 java.lang.NullPointerException;
- blockchain - 为什么需要在区块链中根据难度计算哈希?
- java - 通过 Java/Python 将 dto 传递给 Google Apps 脚本方法
- javascript - 验证为真后隐藏表单
- sql - 条纹的增量列
- r - 如何在每次渲染闪亮的应用程序时停止重新创建数据集