我在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
功能。集合没有这种方法。有什么建议吗?
答案 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操作。