假设我需要按值删除HashMap中的某些内容.
我可以做这个:
myMap.values().remove("abc");
但是这还会删除指向此值的键吗?我可以放心,完整的Key-> Value行已经消失了吗?
1 -> a 2 -> ab 3 -> abc 4 -> abcd
在这个操作之后,我确定HashMap中填写的条目列表是3吗?
在内部,Java如何知道还应该删除相应的密钥?毕竟,我只是调用一个通用的Collection Remove.
http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#values()
返回此映射中包含的值的Collection视图.该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然.如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的.该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射.
所以,是的.从values()
视图中删除可以保证从底层映射中删除整个映射.
对于您给出的示例,是的,该条目3 -> abc
将被删除.
在内部,Java如何知道还应该删除相应的密钥?毕竟,我只是调用一个通用的Collection Remove.
返回的Collection
实现map.values()
是一个特殊的实现,它是根据底层映射实现的,而不像普通的Collection
那样实现ArrayList
.因此,实施remove
了Collection
由返回Map.values()
工作在基础地图数据结构.