在 Java 中,让 HashMap 完全填充这种形式的数据:
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
检查随机密钥是否存在时更快,比如 100:
if (map.get(100) == null))
或者
if (!map.containsKey(100))
?
从微优化的角度来看,这个问题很有趣。
在 Java 中,让 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;
}
两者仅在return
类型上有所不同,但如果它是键,则可能会返回您,但是map.get(key)
会返回您,这可用于区分两种可能的返回情况。null
map.containsKey(key)
boolean
map.get(key)
null
这两种方法没有区别。主要区别只是你接下来要做什么。如果您需要价值,那么当然通过获取您将拥有价值。