首页 > 解决方案 > 当从 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功能。收藏没有这样的方法。有什么建议吗?

标签: javaandroidlisthashmap

解决方案


YourList包含对作为 your 值的实例的引用,因此改变mutates 的值Map的各个元素的状态。ListMap

另一方面, yourList不受 . 的支持Map,因此删除其中的元素不会影响Map.

当在其他地方删除值时,是否有任何自动方法从地图中删除键值对?

是的,如果你直接从Collectionby 返回的元素中移除一个元素myMap.values(),它也会从Map.

这是 Javadoc 中的状态values()

集合 java.util.Map.values()

返回此映射中包含的值的集合视图。集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,即通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从 map 中移除相应的映射。它不支持 add 或 addAll 操作。


推荐阅读