在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