2013-04-29 176 views
11

我一直在閱讀/研究爲什麼HashMap快於HashSet爲什麼HashMap比HashSet快?

我不是很理解下面的語句:

  1. HashMapHashSet更快,因爲值相關聯的唯一關鍵詞。

  2. HashSet中,成員對象用於計算哈希碼值,對於兩個對象可以是相同的,所以equals()方法用於檢查是否相等。如果返回false,則表示這兩個對象是不同的。在HashMap中,使用密鑰對象計算哈希碼值。

  3. 使用密鑰對象計算HashMap哈希碼值。在這裏,成員對象用於計算哈希碼,對於兩個對象可以是相同的,因此使用equals()方法檢查相等性。如果返回false,則表示這兩個對象是不同的。

在結束我的問題:

  1. 我想HashMapHashSet計算以同樣的方式的哈希碼。他們爲什麼不同?

  2. 你能否提供一個具體的例子HashSetHashMap以不同的方式計算哈希碼?

  3. 我知道什麼是「關鍵對象」,但是「成員對象」是什麼意思?

  4. HashMap可以做和HashSet一樣的事情,而且速度更快。爲什麼我們需要HashSet?例如:

    HashMap <Object1, Boolean>= new HashMap<Object1, boolean>(); 
    map.put("obj1",true); => exist 
    map.get("obj1"); =>if null = not exist, else exist 
    
+3

您應該瞭解一下'Map'和'Set'之間的區別。它們是兩種不同類型的「藏品」。完成之後,應該清楚爲什麼從地圖獲取特定對象比從集合中獲得更快。 – Magnilex 2013-04-29 12:49:24

+0

Hashset建立在HashMap上。 Set用於唯一性。它不是關鍵值對收集。 – 2013-04-29 12:50:27

+0

是的。我知道他們實現了不同的界面。但有些人說hashset在後端使用hashmap。如果這就是事實,爲什麼hashset會比hashmap慢? – runcode 2013-04-29 12:50:43

回答

18

性能:

如果看一下HashSet的(至少JDK 6,7和8)時,它使用的HashMap內部的源代碼,所以它基本上恰好你在做什麼樣的代碼。所以,如果你需要一個Set實現,你可以使用HashSet,如果你需要一個Map-HashMap的話。使用HashMap而不是HashSet的代碼將具有與直接使用HashSet完全相同的性能。

選擇正確的集合

地圖 - 鍵映射到值(關聯數組) - http://en.wikipedia.org/wiki/Associative_array

設置 - 不包含重複元素的集合 - http://en.wikipedia.org/wiki/Set_(computer_science)

如果您需要收集的唯一東西是檢查某個元素是否存在 - 請使用Set。你的代碼會更清晰,更易於理解。

如果您需要爲元素存儲一些數據 - 請使用Map。

+2

denis說什麼。此外,您可以使用Collections.newSetFromMap將任何Map包含在一個包中。 – 2013-04-29 15:59:27

0

這些答案都不能真正解釋爲什麼 HashMap比HashSet快。他們都必須計算哈希碼,但考慮一下HashMap的關鍵性質 - 它通常是一個簡單的字符串,甚至是一個數字。計算它的哈希碼比整個對象的默認哈希碼計算快得多。如果HashMap的鍵與存儲在HashSet中的對象是同一個對象,那麼性能就不會有真正的差別。區別在於什麼樣的對象是HashMap的關鍵。