2013-04-29 14 views
11

Ho letto/ricercato il motivo per cui HashMap è più veloce di HashSet.Perché HashMap è più veloce di HashSet?

Io non sono del tutto la comprensione dei seguenti dichiarazioni:

  1. HashMap è più veloce di HashSet perché i valori sono associati ad una chiave univoca.

  2. In HashSet, l'oggetto membro viene utilizzato per il calcolo del valore hashcode che può essere lo stesso per due oggetti, pertanto il metodo equals() viene utilizzato per verificare l'uguaglianza. Se restituisce false, ciò significa che i due oggetti sono diversi. In HashMap, il valore hashcode viene calcolato utilizzando l'oggetto chiave.

  3. Il valore di codice hash HashMap viene calcolato utilizzando l'oggetto chiave. Qui, l'oggetto membro viene utilizzato per calcolare l'hashcode, che può essere lo stesso per due oggetti, quindi il metodo equals() viene utilizzato per verificare l'uguaglianza. Se restituisce false, ciò significa che i due oggetti sono diversi.

Per concludere la mia domanda:

  1. ho pensato HashMap e HashSet calcolare il codice hash nello stesso modo. Perché sono diversi?

  2. Puoi fornire un esempio concreto di come HashSet e HashMap calcoli l'hashcode in modo diverso?

  3. So cosa è un "oggetto chiave", ma cosa significa "oggetto membro"?

  4. HashMap può fare le stesse cose di HashSet e più veloce. Perché abbiamo bisogno di HashSet? Esempio:

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

Dovresti leggere la differenza tra 'Mappa' e' Imposta'. Sono due diversi tipi di 'Collection's. Una volta fatto ciò, dovrebbe essere chiaro il motivo per cui ottenere un oggetto specifico da una mappa è più veloce che da un set. – Magnilex

+0

Hashset è costruito su HashMap. E Set è usato per l'unicità. Non è una collezione di coppie di valori chiave. –

+0

Sì. So che implementano un'interfaccia diversa. Ma alcune persone dicono che l'hashset sta usando hashmap nel backend. Se è così, perché hashset sarà più lento di hashmap? – runcode

risposta

18

Performance:

Se si guarda il codice sorgente di HashSet (almeno JDK 6, 7 e 8), utilizza HashMap internamente, in modo che fondamentalmente fa esattamente cosa stai facendo con il codice di esempio.

Quindi, se hai bisogno di un'implementazione Set, usi HashSet, se ti serve una mappa - HashMap. Il codice che utilizza HashMap invece di HashSet avrà esattamente le stesse prestazioni dell'utilizzo diretto di HashSet.

scelta la collezione giusta

Mappa - chiavi mappe per valori (array associativo) - http://en.wikipedia.org/wiki/Associative_array.

Set: una raccolta che non contiene elementi duplicati - http://en.wikipedia.org/wiki/Set_(computer_science).

Se l'unica cosa di cui hai bisogno per la tua collezione è controllare se un elemento è presente lì - usa Set.Il tuo codice sarà più pulito e più comprensibile per gli altri.

Se è necessario memorizzare alcuni dati per i propri elementi, utilizzare Mappa.

+2

Cosa dicono i denis. Inoltre, puoi racchiudere qualsiasi mappa con un set utilizzando Collections.newSetFromMap. –

0

Nessuna di queste risposte spiega veramente perché HashMap è più veloce di HashSet. Entrambi devono calcolare l'hashcode, ma pensare alla natura della chiave di una HashMap - in genere è una semplice stringa o addirittura un numero. Il calcolo del codice hash è molto più veloce del calcolo hashcode predefinito di un intero oggetto. Se la chiave di HashMap fosse lo stesso oggetto memorizzato in un HashSet, non ci sarebbe alcuna differenza nelle prestazioni. La differenza arriva nel tipo di oggetto che è la chiave di HashMap.

Problemi correlati