2013-02-09 87 views
8

在Java中,有一个HashMap完全填满了这种形式的数据:检查HashMap的存在,关键

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

检查随机密钥的存在时,什么是快,说100:

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

if (!map.containsKey(100)) 

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

+0

为什么不简单测试呢? – rekire 2013-02-09 13:03:17

+0

我做过了,但它给出了所有不同的执行时间,这些执行时间在一定的时间间隔内差不多一样。所以我不知道什么是更快。 – 2013-02-09 13:04:16

回答

15

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源。我其实应该检查一下。

5

其实这两种方法都是一样的。如果您在java.util.HashMap源代码,看看你能找到未来的containsKey实现:

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

嗯,@downvoter,纠正我,如果我错了。 – bsiamionau 2015-03-19 21:40:45

2

两个不同之处仅return类型的不同之处在于map.get(key)可能会返回null的情况下,如果它是一个关键,但map.containsKey(key)将返回boolean可能用于剔除map.get(key)返回null这两种可能的情况。

1

这两种方法没有区别。主要区别只有你接下来要做的事情。如果你需要价值,那么当然通过得到你会有价值。