HashMap.containsValue - 重点是什么?

时间:2010-03-29 13:03:02

标签: java hashmap

我有一个HashMap,我需要通过整数值获取一个项目。我注意到有一个containsValue()函数,但看起来我仍然需要迭代遍历地图才能找到正确的索引。

我的问题是;如果我之后需要遍历它,为什么要使用containsValue()?

另外,我完全忽略了这一点吗? ; - )

7 个答案:

答案 0 :(得分:7)

地图将键映射到值。如果您有一个值并且您知道地图包含此值,那么为什么还需要该键?

另一方面,如果您确实需要密钥或者您只拥有该值的属性,则可以迭代entrySet(),检查该值并返回密钥(如果找到):

for (Map.Entry<Index,Value> entry : map.entrySet()) {
  if (entry.getValue().getXy().equals(xy)) {
    return entry.getKey();
  }
}

答案 1 :(得分:6)

地图是值商店的关键。说包含的值仅作为指示。我认为,要获得允许您从值中检索密钥的双向链接,您将不得不依赖于来自google-collections的BiMap之类的内容

答案 2 :(得分:3)

HashMap(或一般地图)使用键/值对。向地图添加内容时,必须指定一个键,这是在以后检索值时再次使用的键。基于HashMap的实现,给定一个键,在O(1)时间内完成值的检索。

containsValue是一个有用的方法,用于检查HashMap是否包含您要查找的值,但我真的不明白为什么要使用它来检索您要查找的值?

使用地图的相应方式如下:

HashMap<Integer, Object> myMap = new HashMap<Integer, Object>();
myMap.put(1, object1);
myMap.put(2, object2);
myMap.put(3, object3);

现在您可以通过以下方式获取对象:

Object myObject = myMap.get(1);

如果你这样做了:

myMap.containsValue(1);

这将返回false,因为1是键,而不是值。你可以这样做:

myMap.containsKey(1);

如果你只是想知道它是否存在,但是在调用时没有问题:

Object myObject = myMap.get(99);

如果没有密钥,它只会返回null,99。

所以基本上,重点是,你是正确的,当你试图检索值时,使用containsValue毫无意义。如果要先检查是否存在,请使用get或containsKey。

答案 3 :(得分:2)

之后您不需要遍历它。 containsValue()在您不需要确切知道您的价值所在的情况下非常有用,而且只需要知道它是否已经在地图中。如果您需要准确了解Map中Map的位置,请不要使用containsValue() - 向右跳转到迭代器并找到它。

答案 4 :(得分:1)

如果您不需要遍历整个hashmap,可以使用containsValue(),例如,如果您想将键值对添加到hashmap,但在此之前您想知道该值是否在hashmap中。在这种情况下,对于添加操作,您不需要遍历整个hashmap。

答案 5 :(得分:0)

让我为弗雷德里克重新提出这个问题:

那么,containsValue(),它是否在内部(它的输入参数)与hashmap中的每个“值”进行比较?或者它是否以某种方式使用哈希码(或其他技术)来生成结果?对于前一种情况,我们可以简单地使用迭代器来遍历并匹配我们的值的存在与所有hashmap的“值”。 问题的重要性在于表现或速度!

答案 6 :(得分:0)

我认为Map.containsValue是Map接口设计中的一个错误。

偶尔会遇到Map实现,这些实现提供了一个比containsValue快于线性的实现。例如,映射可以在内部将每个不同的值表示为一个小整数,然后使用位模式来表示值集。这样的地图可能能够在恒定时间内检测到它从未见过给定值(尽管可能仍需要线性时间才能返回肯定的结果)。

但是,有时需要线性时间而有时需要恒定时间的运算对于通用算法而言并不是有用的基础。您不能用LinkedList代替ArrayList并期望一切正常,即使它们都支持API中的随机访问。需要固定时间containsValue的客户端必须维护单独的HashSet值,以确保良好的性能。对线性时间性能满意的客户可以自己编写循环。

即使Map接口的维护者也后悔添加了containsValue,他们当然也无法立即删除它。