【问题标题】:What happens when an item is deleted from a list initialized by hashmap.values()?当从 hashmap.values() 初始化的列表中删除一个项目时会发生什么?
【发布时间】:2019-02-11 15:32:12
【问题描述】:

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

【问题讨论】:

    标签: java android list hashmap


    【解决方案1】:

    您的List 包含对作为Map 值的实例的引用,因此改变List 的各个元素的状态会改变Map 的值。

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

    当值在其他地方被删除时,是否有任何自动方法从地图中删除键值对?

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

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

    集合 java.util.Map.values()

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

    【讨论】:

    • @Mehmed 我不确定您的代码是什么样的(将 List 传递给适配器),所以我无法回答。
    猜你喜欢
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    相关资源
    最近更新 更多