我在 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功能。Collection没有这样的方法。有什么建议吗?
1 回答
万千封印
TA贡献1891条经验 获得超3个赞
您List
包含对是你的价值观的实例的引用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 操作。
添加回答
举报
0/150
提交
取消