繁体   English   中英

在移除密钥后可以安全地迭代hasmap的值集合吗?

[英]Safe to iterate values collection of hasmap after key removal?

    HashMap<String, DBrow> datamap = new HashMap<String, DBrow>();
    datamap.remove(key);

    Collection<DBrow> values = datamap.values();

    for(DBrow dbrow : values){
        //is key's value removed from hashmap?
        //ignore case where another key may have the same reference.
    }

我不确定哈希图是否仅依靠垃圾回收器来最终删除键中映射的值,还是立即将其删除? 我看不到有一种方法可以保证删除哈希图中的k / v对,只是键。

映射中的键和值链接在一起。 一个Map就是一Set Map.Entry对象。 (请参阅.entrySet() )。 实际上,删除键会删除整个条目。

.keySet().values()方法仅根据这些条目构造临时SetCollection

请注意,如果不是这种情况,则无法保证键的迭代顺序与值的迭代顺序相同。 这会很烦,不是吗? ;)

Hashmap.remove(key)删除Hashmap.remove(key)的映射,并返回映射的值;如果没有映射,则返回null 如果您不持有对该值的任何其他引用,则将对其进行垃圾回收。 因此,不需要其他动作。

移除方法的Java文档说:

   //Removes the mapping for the specified key from this map if present.
public V remove(Object key) {....

因此,删除密钥还可以确保删除与其关联的值。

是值将立即删除, hashmap的条目不过是具有KeyValue字段的Entry Class对象。 当您在地图上调用remove时,它将基于hash code值找到对象,并检查是否equality如果为true,则会删除整个对象引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM