Java 移除键后是否可以安全地迭代hasmap的值集合? HashMap datamap=newhashmap(); datamap.remove(键); 集合值=datamap.values(); for(DBrow DBrow:values){ //键的值是否已从hashmap中删除? //忽略另一个键可能具有相同引用的情况。 }

Java 移除键后是否可以安全地迭代hasmap的值集合? HashMap datamap=newhashmap(); datamap.remove(键); 集合值=datamap.values(); for(DBrow DBrow:values){ //键的值是否已从hashmap中删除? //忽略另一个键可能具有相同引用的情况。 },java,Java,我不确定hashmap是否仅仅依靠垃圾收集器最终删除从键映射的值,或者它是否立即被删除?我看不到一种方法可以保证删除hashmap中的k/v对,只删除密钥 贴图中的键和值链接在一起。Map就是对象的集合。(见附件)。删除一个键实际上会删除整个条目 .keySet()和.values()方法只是从这些条目构造特别的Sets和Collections 请注意,如果不是这种情况,则无法保证键的迭代顺序与值的迭代顺序相同。这会很烦人,不是吗?;) Hashmap.remove(key)删除键的映射并返回映

我不确定hashmap是否仅仅依靠垃圾收集器最终删除从键映射的值,或者它是否立即被删除?我看不到一种方法可以保证删除hashmap中的k/v对,只删除密钥

贴图中的键和值链接在一起。
Map
就是对象的
集合。(见附件)。删除一个键实际上会删除整个条目

.keySet()
.values()
方法只是从这些条目构造特别的
Set
s和
Collection
s


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

Hashmap.remove(key)
删除键的映射并返回映射值,如果没有映射,则返回
null
。如果您不持有对该值的任何其他引用,它将被垃圾收集。因此,无需执行其他操作。

删除方法的Java文档说明:

    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.
    }

因此,删除键也可以确保删除与之关联的值。

是值将立即删除,
hashmap
中的条目只不过是
entry
类的对象,该类具有
key
value
字段。当您在map上调用remove时,它将根据
散列码
值查找对象,并检查
是否相等
如果为true,它将删除整个对象引用。

我在阅读了weakhashmaps后感到害怕,在那里,当密钥不再存在时,它决定删除该值。我担心正常的hasmaps可能也会等待gc。我明白了,这只是weakhashmaps的一个退路;对于任何类型的hashmap,当您直接在map中删除密钥时,其值会立即被删除。您的条目集解释帮助我理解了这一点——它们是如何配对的,删除是立即的,这就是我选择此答案的原因。请注意
WeakHashMap
的文档中所说的:“WeakHashMap中的一个条目在其密钥不再正常使用时将自动删除。”(强调矿山)WeakHashMap依赖gc表示“不正常使用”“不是即时的检测。如果从weakhasmap或hashmap中删除键,我现在看到,在任何一种情况下,通过该方法删除值都是即时的。老实说,我对弱引用没有丝毫经验。。。我知道有弱引用、软引用和强引用,默认为strong,但仅此而已;)
   //Removes the mapping for the specified key from this map if present.
public V remove(Object key) {....