从hashmap.values()初始化的列表中删除某项时会发生什么?

时间:2018-09-06 11:17:26

标签: java android list hashmap

我在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值的引用。当我在myList中的项目中调用setter函数时,相关值也在myMap中进行了更新,以支持我的假设。但是,每当我从myList删除项目时,myMap都会继续将MyClass实例保留在其中。由于myMap仍具有对该实例的引用,因此该被删除的实例可能不是垃圾回收。我说的对吗?

在其他地方删除键值对时,是否有任何自动方法可以从映射中删除键值对?

更新:B类将myList传递给Android适配器。因此,我需要某种get功能。集合没有这种方法。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您的List包含对实例的引用,这些实例是您的Map的值,因此,将List的各个元素的状态进行突变会使Map的值进行突变。

另一方面,您的List没有Map的支持,因此删除其中的元素不会影响Map的条目。

  

在其他地方删除键值对时,是否有任何自动方法可以从映射中删除键值对?

是的,如果直接从Collection返回的myMap.values()中删除一个元素,它也会从Map中删除相应的键值对。

这是values()的Javadoc中的状态:

  

集合java.util.Map.values()

     

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