2013-02-09 39 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

這兩種方法沒有區別。主要區別只有你接下來要做的事情。如果你需要價值,那麼當然通過得到你會有價值。