我在A级有以下声明:

Map<String, MyClass> myMap = Collections.synchronizedMap(new LinkedHashMap<String, MyClass>());

A级还具有以下功能:
public List<MyClass> getMapValuesAsList() {
    return new ArrayList<>(myMap.values());
}

在B类中,我的aList初始化如下:
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操作。

10-02 08:00
查看更多