猿问

从 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功能。Collection没有这样的方法。有什么建议吗?


潇湘沐
浏览 135回答 1
1回答

万千封印

您List包含对是你的价值观的实例的引用Map,这样的突变的各个元素的状态List的变异值Map。另一方面, yourList不受 支持Map,因此删除它的元素不会影响Map.当值在其他地方被删除时,是否有任何自动方法可以从地图中删除键值对?是的,如果直接从Collectionby 返回的元素中删除一个元素myMap.values(),它也会从Map.这是 Javadoc 中的状态values():集合 java.util.Map.values()返回此映射中包含的值的集合视图。集合由映射支持,因此对映射的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是不确定的。该集合支持元素移除,通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作从 map 中移除相应的映射。它不支持 add 或 addAll 操作。
随时随地看视频慕课网APP

相关分类

Java
我要回答