如果我使用hashMap.values()。remove()从HashMap中删除一个值,它会从地图中删除完整的键/值记录吗?

时间:2015-12-14 20:32:52

标签: java

假设我需要删除HashMap中的某些内容按值

我可以这样做:

digest

但是这也会删除指向此值的键吗?我可以放心,完整的Key-> Value行已经消失了吗?

myMap.values().remove("abc");

在此操作之后,我确定HashMap中填写的条目列表是3?

在内部,Java如何知道还应该删除相应的密钥?毕竟,我只是调用一个通用的Collection Remove。

2 个答案:

答案 0 :(得分:6)

http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#values()

  

返回此地图中包含的值的Collection视图。 集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了地图(除非通过迭代器和#39;自己的删除操作),迭代的结果是未定义的。 该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。

所以,是的。从values()视图中删除可以保证从基础地图中删除整个映射。

对于您提供的示例,是的,条目3 -> abc将被删除。

  

在内部,Java如何知道还应该删除相应的密钥?毕竟,我只是调用一个通用的Collection Remove。

Collection返回的map.values()实现是一个特殊的实现,它是根据底层地图实现的,而不是像Collection这样的普通ArrayList实现。因此,remove返回的Collection的{​​{1}}实现对基础地图数据结构进行操作。

答案 1 :(得分:0)

  

我只是调用一个通用的Collection Remove。

就像你说的那样,它会调用Collection.remove(Object)来表示

  

从此集合中移除指定元素的单个实例(如果存在)(可选操作)。更正式地,如果此集合包含一个或多个此类元素,则删除元素e(o == null?e == null:o.equals(e))。如果此collection包含指定的元素,则返回true(或等效地,如果此集合因调用而更改)。

由于HashMap未被排序,它将删除第一个条目,该条目具有匹配值,通过迭代值找到它。