假设我需要删除HashMap中的某些内容按值。
我可以这样做:
digest
但是这也会删除指向此值的键吗?我可以放心,完整的Key-> Value行已经消失了吗?
myMap.values().remove("abc");
在此操作之后,我确定HashMap中填写的条目列表是3?
在内部,Java如何知道还应该删除相应的密钥?毕竟,我只是调用一个通用的Collection Remove。
答案 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未被排序,它将删除第一个条目,该条目具有匹配值,通过迭代值找到它。