在Java中,有一个HashMap完全填满了这种形式的数据:检查HashMap的存在,关键
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
检查随机密钥的存在时,什么是快,说100:
if (map.get(100) == null))
或
if (!map.containsKey(100))
?
从微观优化的角度来看,问题很有趣。
在Java中,有一个HashMap完全填满了这种形式的数据:检查HashMap的存在,关键
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
检查随机密钥的存在时,什么是快,说100:
if (map.get(100) == null))
或
if (!map.containsKey(100))
?
从微观优化的角度来看,问题很有趣。
的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
源。我其实应该检查一下。
其实这两种方法都是一样的。如果您在java.util.HashMap
源代码,看看你能找到未来的containsKey实现:
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
嗯,@downvoter,纠正我,如果我错了。 – bsiamionau 2015-03-19 21:40:45
两个不同之处仅return
类型的不同之处在于map.get(key)
可能会返回null
的情况下,如果它是一个关键,但map.containsKey(key)
将返回boolean
可能用于剔除map.get(key)
返回null
这两种可能的情况。
这两种方法没有区别。主要区别只有你接下来要做的事情。如果你需要价值,那么当然通过得到你会有价值。
为什么不简单测试呢? – rekire 2013-02-09 13:03:17
我做过了,但它给出了所有不同的执行时间,这些执行时间在一定的时间间隔内差不多一样。所以我不知道什么是更快。 – 2013-02-09 13:04:16