2013-04-29 14 views
11

Ich habe den Grund gelesen/erforscht, warum HashMap ist schneller als HashSet.Warum ist HashMap schneller als HashSet?

Ich bin nicht ganz verstehen, die folgenden Aussagen:

  1. HashMap schneller als HashSet ist, weil die Werte zu einem eindeutigen Schlüssel zugeordnet sind.

  2. In HashSet, Mitglied Objekt wird zur Berechnung Hash-Wert, die für zwei Objekte identisch sein kann, so equals() Methode wird verwendet, um auf Gleichheit zu prüfen. Wenn es false zurückgibt, bedeutet das, dass die zwei Objekte unterschiedlich sind. In HashMap wird der Hashcodewert mithilfe des Schlüsselobjekts berechnet.

  3. Der Hash-Code HashMap wird mithilfe des Schlüsselobjekts berechnet. Hier wird das Member-Objekt verwendet, um den Hash-Code zu berechnen, der für zwei Objekte derselbe sein kann, so dass die Methode equals() verwendet wird, um auf Gleichheit zu prüfen. Wenn es false zurückgibt, bedeutet das, dass die zwei Objekte unterschiedlich sind.

Auf meine Frage schließen:

  1. Ich dachte HashMap und HashSet den Hash-Code auf die gleiche Art und Weise berechnen. Warum sind sie anders?

  2. Können Sie ein konkretes Beispiel geben, wie HashSet und HashMap den Hashcode anders berechnen?

  3. Ich weiß, was ein "Schlüsselobjekt" ist, aber was bedeutet es mit "Mitgliedsobjekt"?

  4. HashMap kann die gleichen Dinge wie HashSet tun, und schneller. Warum brauchen wir HashSet? Beispiel:

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

Sie sollten über den Unterschied zwischen 'Map' und' Set' lesen. Sie sind zwei verschiedene Arten von 'Collection's. Sobald Sie das getan haben, sollte klar sein, warum ein bestimmtes Objekt aus einer Map schneller als aus einem Set ist. – Magnilex

+0

Hashset basiert auf HashMap. Und Set wird für die Einzigartigkeit verwendet. Es ist keine Schlüsselwertpaarsammlung. –

+0

Ja. Ich weiß, dass sie unterschiedliche Schnittstellen implementieren. Aber einige Leute sagen, dass das Hash-Set hashmap im Backend verwendet. Wenn das die Wahrheit ist, warum wird hasset langsamer als hashmap? – runcode

Antwort

18

Performance:

Wenn man sich den Quellcode von HashSet (mindestens JDK 6, 7 und 8), verwendet es HashMap intern, so tut es im Grunde genau was Sie mit Beispielcode tun.

Wenn Sie also eine Set-Implementierung benötigen, verwenden Sie HashSet, wenn Sie eine Map - HashMap benötigen. Code, der HashMap anstelle von HashSet verwendet, hat genau die gleiche Leistung wie HashSet direkt.

Die Wahl der richtigen Sammlung

Karte - Karten Tasten auf Werte (assoziatives Array) - http://en.wikipedia.org/wiki/Associative_array.

Set - eine Sammlung, die keine doppelten Elemente enthält - http://en.wikipedia.org/wiki/Set_(computer_science).

Wenn das einzige, was Sie für Ihre Sammlung benötigen, ist zu prüfen, ob dort ein Element vorhanden ist - verwenden Sie Set.Ihr Code wird für andere sauberer und verständlicher.

Wenn Sie Daten für Ihre Elemente speichern müssen, verwenden Sie Map.

+2

Was Denis gesagt. Außerdem können Sie jede Map mithilfe von Collections.newSetFromMap mit einem Satz umbrechen. –

0

Keine dieser Antworten erklären wirklich warum HashMap ist schneller als HashSet. Beide müssen den Hashcode berechnen, aber über die Art des Schlüssels einer HashMap nachdenken - es ist typischerweise ein einfacher String oder sogar eine Zahl. Das Berechnen des Hashcodes ist viel schneller als die Standard-Hashcodeberechnung eines gesamten Objekts. Wenn der Schlüssel der HashMap dasselbe Objekt wie das in einem HashSet gespeicherte war, würde es keinen wirklichen Unterschied in der Leistung geben. Der Unterschied liegt darin, welche Art von Objekt der Schlüssel der HashMap ist.

Verwandte Themen