检查是否存在HashMap密钥

时间:2013-02-09 13:01:47

标签: java hashmap micro-optimization containskey

在Java中,让HashMap完全填充以下形式的数据:

HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);

检查随机密钥是否存在时更快,比如100:

if (map.get(100) == null))

if (!map.containsKey(100))

从微观优化的角度来看,问题很有意思。

4 个答案:

答案 0 :(得分:20)

containsKey应该非常轻微,因为它会导致额外的函数调用(它只调用getEntry)(它可能会被优化掉,我不是确定Java是否会这样做)。 containsKey看起来像:

public boolean containsKey(Object key) {
  return getEntry(key) != null;
}

但请注意,containsKey在其他Map实现上可能会稍微更快(但可能不是标准Java API中的那些)。

通常我的实现看起来像:(避免需要containsKey

int[] arr = map.get(100);
if (arr == null) // doesn't exist
  // do stuff
else // exists
  // do stuff with arr

以下肯定比上述慢:(如果您寻找的项目存在合理的时间)

if (!map.containsKey(100)) // doesn't exist
  // do stuff
else // exists
{
  int[] arr = map.get(100);
  // do stuff with arr
}

修改:感谢zvzdhk提供containsKey的来源。我应该检查一下。

答案 1 :(得分:6)

实际上两种方法都是一样的。如果你查看java.util.HashMap源代码,你可以找到下一个containsKey实现:

public boolean containsKey(Object key) {
    return getEntry(key) != null;
}

答案 2 :(得分:3)

这两者仅在return类型上有所不同,但map.get(key)可能会返回null以防万一它是一个密钥,但是map.containsKey(key)会返回boolean这可以用来解决map.get(key)返回null的两种可能情况。

答案 3 :(得分:1)

这两种方法没有区别。主要区别仅在于您接下来要做什么。如果你需要这个值,当然可以得到你的价值。