我在A级有以下声明:
Map<String, MyClass> myMap = Collections.synchronizedMap(new LinkedHashMap<String, MyClass>());
A级还具有以下功能:
public List<MyClass> getMapValuesAsList() {
return new ArrayList<>(myMap.values());
}
在B类中,我的a
List
初始化如下:List<MyClass> myList = cart.getMapValuesAsList();
我假设
myList
会保留对myMap
值的引用。当我在myList
中调用项中的setter函数时,相关值也会在myMap
中更新,支持我的假设。但是,每当我从myList
中删除一个项时,myMap
会继续保留其中的MyClass
实例。此已删除的实例可能不是垃圾回收的,因为myMap
仍有对它的引用。我说得对吗?当值在其他地方被删除时,是否有自动的方法从映射中删除键值对?
更新:B类通过
myList
到Android适配器。因此,我需要一些get
功能。集合没有这样的方法。有什么建议吗? 最佳答案
您的List
包含对实例的引用,这些实例是您的Map
的值,因此改变List
的单个元素的状态会改变Map
的值。
另一方面,您的List
没有Map
的支持,因此删除其中的元素不会影响Map
的条目。
当值在其他地方被删除时,是否有自动的方法从映射中删除键值对?
是的,如果直接从Collection
返回的myMap.values()
中删除元素,它也将从Map
中删除相应的键值对。
这是javadoc中的状态:
集合java.util.map.values()
返回此映射中包含的值的集合视图。该集合由映射支持,因此对映射的更改将反映在该集合中,反之亦然。如果在对集合进行迭代时修改了映射(通过迭代器自己的删除操作除外),则迭代的结果是未定义的。集合支持元素移除,通过iterator.remove、collection.remove、removeall、retainal和clear操作从映射中移除相应的映射。它不支持add或addall操作。