为什么Java的Map接口有一个containsValue(Object)方法,但没有value->键查找?

时间:2011-11-22 07:47:02

标签: java map

这里有一些问题如何获得与给定值相关联的Map个密钥,答案指向谷歌集合(用于双向映射)或基本上说“循环它”。

我刚刚注意到Map接口有一个boolean containsValue(Object value)方法,“对于Map接口的大多数实现,可能需要在地图大小上线性的时间”以及{{1}中的实现确实迭代AbstractMap

设计决定在entrySet()中包含containsValue但是没有Map的原因可能是什么?我可以看出为什么人们会省略这两者,或者包括两者,但是如果有的话,为什么不省略?

我想到的一件事是,它需要任何Map实现来了解返回值的Collection实现,但这实际上并不是一个好理由,因为Collection<V> getKeysForValue(Object)方法也返回一个集合(在Collection<V> values())的情况下匿名new AbstractCollection<V>()

2 个答案:

答案 0 :(得分:3)

有些集合支持这一点,但它们通常涉及主题化反向查找映射,这比相对简单的一对一映射更昂贵。因此,支持这一点可能会使所有地图的更新成本增加两倍。

另一个问题是概括。密钥必须实现hashCode和equals(对于Hash映射)或可比较(对于Sorted Maps)值不必实现任何使得构造广义反向查找不可能的任何东西,或者它对不太可能需要的值提出额外要求

答案 1 :(得分:2)

自1.2以来,地图可以返回Collection个键和值,因此查找值非常简单:public Object containsValue(Object v) {return values().contains(v);}此方法使用来自values()和{{1}的原生优化对于contains()的任何实现,但在大多数情况下可能都很慢......

您正在寻找的Map并非无足轻重。它需要一个特定的算法,并且该算法不能足够通用,必须针对getKeysForValue(Object)的每个实现进行优化。

这可能是原因,或者仅仅是Collection API充满了这种小漏洞......