2016-09-02 23 views
1

如果我知道輸入到地圖條目中的值是相同的,我會更好地檢查它是否不在地圖中,或者只是做放? 換句話說,是檢查地圖是否包含密鑰或僅放置該值會更快嗎?

if (!map.containsKey(key)){ 
    map.put(key, value); 
} 

不止做map.put(key, value)如果我知道的值是關鍵一樣好。

背景: 我正在嘗試計算將id映射到一組int值的映射的所有重疊。例如:給出{A:1,2,3; B:2,4,6; C:2,3,4; D:1,3,5}我需要得到這張地圖:{AnB:2; AnC:2,3; AnD:1,3; BnC:2,4; AnBnC:2; AnCnD:3;}。遞歸執行此操作不適用於我們運行堆空間的較大集。所以我通過將下一個「圖層」添加到現有圖層上來進行迭代。因此,爲了得到AnBnC,我取AnB並計算與C的交點。但這也意味着我拿AnC並計算與B的交點,它們都會給出相同的結果。

謝謝!

+1

你認爲哪一個更簡單/更清晰?你應該使用那個。做兩個操作可能會比一個操作慢。 –

+0

只是編輯它,如果'!containsKey',以便它仍然是一種操作。 – Logan

+4

在java-8中考慮['Map#putIfAbsent'](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#putIfAbsent-KV-) – bradimus

回答

2

我不確定你的直接問題的答案是哪一個更快,但如果你想優化,我建議避免做不必要的集合交集。就像是;

intersectionKey = setA.key + setB.key; 
if (!map.containsKey(intersectionKey)) { 
    intersection = A | B; 
    map.put(intersectionKey, intersection); 
} 
+0

謝謝。我現在意識到,我離開那個完全改變事情的問題。 – Logan

0

這取決於該地圖使用的是?

https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K,%20V)

的Map.put API不會返回先前的值。 因此,put()API自身必須比get()貴,而get()必須比contains()昂貴。

簡而言之,對於基本的HashMap/TreeMap實現來說,只是.put會更快。

但是,它可能是ConcurrentMap的一個例外,它們的實現可能會嘗試優化線程本地或避免多線程環境中的鎖定開銷。

順便說一句,但如果我是你。如果可能,我將使用BitSet來優化內存使用情況和性能。