在Java中,让HashMap完全填充以下形式的数据:
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
检查随机密钥是否存在时更快,比如100:
if (map.get(100) == null))
或
if (!map.containsKey(100))
从微观优化的角度来看,问题很有意思。
答案 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)
这两种方法没有区别。主要区别仅在于您接下来要做什么。如果你需要这个值,当然可以得到你的价值。